stronger_parameters 2.10.1 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fd58b7c7abd50d4c49328bd4c1ed5f394a30d0e713605ef853772cbb3a48d65
4
- data.tar.gz: 755ada7e832133b1c797df0265e5e3b765af8106866c031f8de738a46f84f7d5
3
+ metadata.gz: 598d8d30678b80a1fff8224887b69dacd1975b8c3849f123961b3514a643e6e3
4
+ data.tar.gz: d80b6fa97333c507ab7e2282ed78e22260c352f528d50f434340afdd206b2c3a
5
5
  SHA512:
6
- metadata.gz: 196c792377887933facef2fb25632bb5d6641e848786a821b4f4cfb254a5b04dfe2f12f9ebbb66928ada0a1ed69a6001f725708c7b9f2e2d613e14d5f83db489
7
- data.tar.gz: d0bb7384ec7ad0a419564c42f4610867dae7948ac630261b63fd73ac32c1d22661bffe2577be5f1fa82669fe9c8b5fd401b2f23a6848272d17003b2b42c120fa
6
+ metadata.gz: b8f5201eeb8a1eb53a58f6eaacae23d40f08dcdb28da8ba9c650f607c19d126e5eea951a788fedc6cd82f0b4e9a020385952662ea6f44655f65e0c992e89b6e4
7
+ data.tar.gz: 932b7e76c8d86afefe1aa9d5cfdbf9af19ea2f784ed678e469bebde5761cd6317fd39075e86a029cc13ed5f2ce1a4fe3221775c48f4ff765db30e86e74593bfe
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # stronger_parameters
2
- [![Build Status](https://travis-ci.org/zendesk/stronger_parameters.svg?branch=master)](https://travis-ci.org/zendesk/stronger_parameters)
2
+ ![CI](https://github.com/zendesk/stronger_parameters/workflows/CI/badge.svg)
3
3
 
4
4
  This is an extension of `strong_parameters` with added type checking and conversion.
5
5
 
@@ -32,6 +32,27 @@ Rails converts empty arrays to nil, so often `Parameters.array | Parameters.nil`
32
32
  It can be convenient to allow nil for all attributes since ActiveRecord converts it to false/0.
33
33
  `ActionController::Parameters.allow_nil_for_everything = true`
34
34
 
35
+ ### Rejecting nils
36
+
37
+ You can reject a request that fails to supply certain parameters by marking them
38
+ as required with the `.required` operator:
39
+
40
+ ```ruby
41
+ params.permit(
42
+ name: Parameters.string.required, # will not accept a nil or a non-String
43
+ email: Parameters.string # optional, may be omitted
44
+ )
45
+ ```
46
+
47
+ This also works in conjunction with the `&` and `|` constraints. For example, to
48
+ express that a `uid` must be either a string or a number:
49
+
50
+ ```ruby
51
+ params.permit(
52
+ uid: (Parameters.string | Parameters.integer).required
53
+ )
54
+ ```
55
+
35
56
  ## Nested Parameters
36
57
 
37
58
  ```ruby
@@ -228,6 +249,7 @@ curl -I 'http://localhost/api/users/1.json' -X POST -d '{ "user": { "id": 1 } }'
228
249
  | Parameters.integer | value.is_a?(Fixnum) or '-1' |
229
250
  | Parameters.float | value.is_a?(Float) or '-1.2' |
230
251
  | Parameters.datetime | value.is_a?(DateTime) or '2014-05-13' or '2015-03-31T14:34:56Z' |
252
+ | Parameters.datetime_iso8601 | value is a date that conforms to ISO8601: '2014-05-13' or '2015-03-31T14:34:56Z' |
231
253
  | Parameters.regexp(/foo/) | value =~ regexp |
232
254
  | Parameters.enum('asc', 'desc') | ['asc', 'desc'].include?(value) |
233
255
  | Parameters.lt(10) | value < 10 |
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require 'stronger_parameters/version'
3
3
  require 'action_pack'
4
- require 'strong_parameters' if ActionPack::VERSION::MAJOR == 3
5
4
  require 'stronger_parameters/parameters'
6
5
  require 'stronger_parameters/constraints'
7
6
  require 'stronger_parameters/controller_support/permitted_parameters'
@@ -18,6 +18,14 @@ module StrongerParameters
18
18
  def ==(other)
19
19
  self.class == other.class
20
20
  end
21
+
22
+ def required
23
+ RequiredConstraint.new(self)
24
+ end
25
+
26
+ def required?
27
+ false
28
+ end
21
29
  end
22
30
 
23
31
  class OrConstraint < Constraint
@@ -50,6 +58,10 @@ module StrongerParameters
50
58
  def ==(other)
51
59
  super && constraints == other.constraints
52
60
  end
61
+
62
+ def required?
63
+ constraints.all?(&:required?)
64
+ end
53
65
  end
54
66
 
55
67
  class AndConstraint < Constraint
@@ -75,5 +87,23 @@ module StrongerParameters
75
87
  def ==(other)
76
88
  super && constraints == other.constraints
77
89
  end
90
+
91
+ def required?
92
+ constraints.any?(&:required?)
93
+ end
94
+ end
95
+
96
+ class RequiredConstraint < Constraint
97
+ def initialize(other)
98
+ @other = other
99
+ end
100
+
101
+ def value(v)
102
+ @other.value(v)
103
+ end
104
+
105
+ def required?
106
+ true
107
+ end
78
108
  end
79
109
  end
@@ -3,6 +3,7 @@ require 'stronger_parameters/constraint'
3
3
  require 'stronger_parameters/constraints/string_constraint'
4
4
  require 'stronger_parameters/constraints/float_constraint'
5
5
  require 'stronger_parameters/constraints/date_time_constraint'
6
+ require 'stronger_parameters/constraints/date_time_iso8601_constraint'
6
7
  require 'stronger_parameters/constraints/regexp_constraint'
7
8
  require 'stronger_parameters/constraints/integer_constraint'
8
9
  require 'stronger_parameters/constraints/nil_constraint'
@@ -14,6 +14,7 @@ module StrongerParameters
14
14
  return v.map do |item|
15
15
  result = item_constraint.value(item)
16
16
  return result if result.is_a?(InvalidValue)
17
+
17
18
  result
18
19
  end
19
20
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:disable Style/DateTime
3
2
  require 'stronger_parameters/constraint'
4
3
 
5
4
  module StrongerParameters
@@ -15,4 +14,3 @@ module StrongerParameters
15
14
  end
16
15
  end
17
16
  end
18
- # rubocop:enable Style/DateTime
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ require 'stronger_parameters/constraint'
3
+
4
+ module StrongerParameters
5
+ class DateTimeIso8601Constraint < Constraint
6
+ def value(v)
7
+ DateTime.iso8601 v
8
+ rescue ArgumentError, TypeError
9
+ StrongerParameters::InvalidValue.new(v, "must be an iso8601 date")
10
+ end
11
+ end
12
+ end
@@ -13,6 +13,7 @@ module StrongerParameters
13
13
  def value(v)
14
14
  v = @string.value(v)
15
15
  return v if v.is_a?(InvalidValue)
16
+
16
17
  if v =~ regexp
17
18
  v
18
19
  else
@@ -1,12 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  require 'action_pack'
3
3
 
4
- if ActionPack::VERSION::MAJOR == 3
5
- require 'action_controller/parameters'
6
- else
7
- require 'action_controller/base'
8
- require 'action_controller/metal/strong_parameters'
9
- end
4
+ require 'action_controller/base'
5
+ require 'action_controller/metal/strong_parameters'
10
6
 
11
7
  require 'stronger_parameters/constraints'
12
8
  require 'stronger_parameters/errors'
@@ -112,6 +108,10 @@ module StrongerParameters
112
108
  DateTimeConstraint.new
113
109
  end
114
110
 
111
+ def datetime_iso8601
112
+ DateTimeIso8601Constraint.new
113
+ end
114
+
115
115
  def file
116
116
  FileConstraint.new
117
117
  end
@@ -139,14 +139,25 @@ module StrongerParameters
139
139
 
140
140
  hash_filter_without_stronger_parameters(params, other_filter)
141
141
 
142
- slice(*stronger_filter.keys).each do |key, value|
142
+ stronger_filter.keys.each do |key|
143
+ value = fetch(key, nil)
144
+ result = nil
145
+
143
146
  if value.nil? && self.class.allow_nil_for_everything
144
- params[key] = nil
147
+ params[key] = nil if key?(key)
145
148
  next
146
149
  end
147
150
 
148
151
  constraint = stronger_filter[key]
149
- result = constraint.value(value)
152
+
153
+ if key?(key)
154
+ result = constraint.value(value)
155
+ elsif constraint.required?
156
+ result = InvalidValue.new(nil, 'must be present')
157
+ else
158
+ next
159
+ end
160
+
150
161
  if result.is_a?(InvalidValue)
151
162
  name = "invalid_parameter.action_controller"
152
163
  ActiveSupport::Notifications.publish(name, key: key, value: value, message: result.message)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module StrongerParameters
3
- VERSION = '2.10.1'
3
+ VERSION = '2.13.0'
4
4
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stronger_parameters
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.1
4
+ version: 2.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mick Staugaard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-10 00:00:00.000000000 Z
11
+ date: 2020-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - "<="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - "<="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: '3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -94,20 +94,6 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: wwtd
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: bump
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -170,20 +156,20 @@ dependencies:
170
156
  requirements:
171
157
  - - ">="
172
158
  - !ruby/object:Gem::Version
173
- version: '3.2'
159
+ version: '4.2'
174
160
  - - "<"
175
161
  - !ruby/object:Gem::Version
176
- version: '5.3'
162
+ version: '6.2'
177
163
  type: :runtime
178
164
  prerelease: false
179
165
  version_requirements: !ruby/object:Gem::Requirement
180
166
  requirements:
181
167
  - - ">="
182
168
  - !ruby/object:Gem::Version
183
- version: '3.2'
169
+ version: '4.2'
184
170
  - - "<"
185
171
  - !ruby/object:Gem::Version
186
- version: '5.3'
172
+ version: '6.2'
187
173
  description:
188
174
  email:
189
175
  - mick@zendesk.com
@@ -199,6 +185,7 @@ files:
199
185
  - lib/stronger_parameters/constraints/boolean_constraint.rb
200
186
  - lib/stronger_parameters/constraints/comparison_constraints.rb
201
187
  - lib/stronger_parameters/constraints/date_time_constraint.rb
188
+ - lib/stronger_parameters/constraints/date_time_iso8601_constraint.rb
202
189
  - lib/stronger_parameters/constraints/decimal_constraint.rb
203
190
  - lib/stronger_parameters/constraints/enumeration_constraint.rb
204
191
  - lib/stronger_parameters/constraints/file_constraint.rb
@@ -226,15 +213,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
226
213
  requirements:
227
214
  - - ">="
228
215
  - !ruby/object:Gem::Version
229
- version: 2.2.0
216
+ version: 2.5.0
230
217
  required_rubygems_version: !ruby/object:Gem::Requirement
231
218
  requirements:
232
219
  - - ">="
233
220
  - !ruby/object:Gem::Version
234
221
  version: '0'
235
222
  requirements: []
236
- rubyforge_project:
237
- rubygems_version: 2.7.6
223
+ rubygems_version: 3.1.3
238
224
  signing_key:
239
225
  specification_version: 4
240
226
  summary: Type checking and type casting of parameters for Action Pack