stronger_parameters 2.10.1 → 2.13.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 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