stronger_parameters 2.11.1 → 2.14.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: 46343e25829800aec85852ba31fbbf040dce9b6071ff53acb04475e524f64cef
4
- data.tar.gz: c4fd41f9cfef6bcfa16d350ca41e00981f583d92697b081afa121e12114a8454
3
+ metadata.gz: ca4cebd1c17a7cb7e68ae01c2fa676c492ab16cbf11998e563e0520c7c0f3bc5
4
+ data.tar.gz: 5a2b40548e74d16db1cdc99426bc44db551c2430a1c1bad8e2425566e18cff43
5
5
  SHA512:
6
- metadata.gz: 5d51dcdbfbaf4a60af24536aedce0f0be8a2ba8da5f8d7cf9b517bc25113645623302a630688bd8d20f82cf1a34a42a8fabd1d9a75982451324bbb83a81a2bd7
7
- data.tar.gz: 7332fac5079c83ac64df9e08b3a6b1abaceba349c99cb4b0c6936089d7928f39f0181c1c444316f8b6577b3c6b267d3e68c60a5a6385680beaebda09d34544ee
6
+ metadata.gz: 13c0e6268b1a9e6567f874c131a038b947047f277db0f581d8f775da9da23ff2170fc1a3a8df8bcd1bedb21cfbbb030f89a4ec55685956be3e4e48176ee20f72
7
+ data.tar.gz: 0eee3ab73de87a06429c6a86242261fc3344d267de36aa26c2921c594aeed36866ac939b303254927cafd284edca2f05408a81b04ea2393fbc89621dd9a07a19
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
@@ -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
@@ -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
@@ -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
@@ -11,4 +10,3 @@ module StrongerParameters
11
10
  end
12
11
  end
13
12
  end
14
- # rubocop:enable Style/DateTime
@@ -6,7 +6,7 @@ module StrongerParameters
6
6
  def value(v)
7
7
  if v.is_a?(Integer)
8
8
  return v
9
- elsif v.is_a?(String) && v =~ /\A-?\d+\Z/
9
+ elsif v.is_a?(String) && v.strip =~ /\A-?\d+\Z/
10
10
  return v.to_i
11
11
  end
12
12
 
@@ -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
@@ -15,9 +15,7 @@ module StrongerParameters
15
15
  when Array
16
16
  ActionController::Parameters.array(*value.map { |v| sugar(v) })
17
17
  when Hash
18
- constraints = value.each_with_object({}) do |(key, v), memo|
19
- memo[key] = sugar(v)
20
- end
18
+ constraints = value.transform_values { |v| sugar(v) }
21
19
  ActionController::Parameters.map(constraints)
22
20
  else
23
21
  value
@@ -63,8 +61,7 @@ module StrongerParameters
63
61
  return :skip if for_action == :skip
64
62
 
65
63
  # FYI: we should be able to call sugar on the result of deep_merge, but it breaks tests
66
- permit_parameters[:all].deep_merge(for_action).
67
- each_with_object({}) { |(k, v), a| a[k] = PermittedParameters.sugar(v) }
64
+ permit_parameters[:all].deep_merge(for_action).transform_values { |v| PermittedParameters.sugar(v) }
68
65
  end
69
66
 
70
67
  private
@@ -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'
@@ -143,14 +139,24 @@ module StrongerParameters
143
139
 
144
140
  hash_filter_without_stronger_parameters(params, other_filter)
145
141
 
146
- slice(*stronger_filter.keys).each do |key, value|
142
+ stronger_filter.each_key do |key|
143
+ value = fetch(key, nil)
144
+
147
145
  if value.nil? && self.class.allow_nil_for_everything
148
- params[key] = nil
146
+ params[key] = nil if key?(key)
149
147
  next
150
148
  end
151
149
 
152
150
  constraint = stronger_filter[key]
153
- result = constraint.value(value)
151
+
152
+ if key?(key)
153
+ result = constraint.value(value)
154
+ elsif constraint.required?
155
+ result = InvalidValue.new(nil, 'must be present')
156
+ else
157
+ next
158
+ end
159
+
154
160
  if result.is_a?(InvalidValue)
155
161
  name = "invalid_parameter.action_controller"
156
162
  ActiveSupport::Notifications.publish(name, key: key, value: value, message: result.message)
@@ -191,5 +197,5 @@ module StrongerParameters
191
197
  end
192
198
  end
193
199
 
194
- ActionController::Parameters.send :include, StrongerParameters::Parameters
195
- ActionController::Base.send :include, StrongerParameters::ControllerSupport
200
+ ActionController::Parameters.include StrongerParameters::Parameters
201
+ ActionController::Base.include StrongerParameters::ControllerSupport
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module StrongerParameters
3
- VERSION = '2.11.1'
3
+ VERSION = '2.14.0'
4
4
  end
@@ -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'
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.11.1
4
+ version: 2.14.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: 2019-05-29 00:00:00.000000000 Z
11
+ date: 2021-11-10 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
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: minitest
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: minitest-rails
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,21 +53,7 @@ dependencies:
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: minitest-around
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: minitest-rg
56
+ name: maxitest
85
57
  requirement: !ruby/object:Gem::Requirement
86
58
  requirements:
87
59
  - - ">="
@@ -95,7 +67,7 @@ dependencies:
95
67
  - !ruby/object:Gem::Version
96
68
  version: '0'
97
69
  - !ruby/object:Gem::Dependency
98
- name: wwtd
70
+ name: bump
99
71
  requirement: !ruby/object:Gem::Requirement
100
72
  requirements:
101
73
  - - ">="
@@ -109,7 +81,7 @@ dependencies:
109
81
  - !ruby/object:Gem::Version
110
82
  version: '0'
111
83
  - !ruby/object:Gem::Dependency
112
- name: bump
84
+ name: single_cov
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
87
  - - ">="
@@ -123,7 +95,7 @@ dependencies:
123
95
  - !ruby/object:Gem::Version
124
96
  version: '0'
125
97
  - !ruby/object:Gem::Dependency
126
- name: single_cov
98
+ name: rubocop
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - ">="
@@ -137,7 +109,7 @@ dependencies:
137
109
  - !ruby/object:Gem::Version
138
110
  version: '0'
139
111
  - !ruby/object:Gem::Dependency
140
- name: rubocop
112
+ name: mocha
141
113
  requirement: !ruby/object:Gem::Requirement
142
114
  requirements:
143
115
  - - ">="
@@ -151,7 +123,7 @@ dependencies:
151
123
  - !ruby/object:Gem::Version
152
124
  version: '0'
153
125
  - !ruby/object:Gem::Dependency
154
- name: mocha
126
+ name: forking_test_runner
155
127
  requirement: !ruby/object:Gem::Requirement
156
128
  requirements:
157
129
  - - ">="
@@ -170,20 +142,20 @@ dependencies:
170
142
  requirements:
171
143
  - - ">="
172
144
  - !ruby/object:Gem::Version
173
- version: '3.2'
145
+ version: '4.2'
174
146
  - - "<"
175
147
  - !ruby/object:Gem::Version
176
- version: '6.1'
148
+ version: '6.2'
177
149
  type: :runtime
178
150
  prerelease: false
179
151
  version_requirements: !ruby/object:Gem::Requirement
180
152
  requirements:
181
153
  - - ">="
182
154
  - !ruby/object:Gem::Version
183
- version: '3.2'
155
+ version: '4.2'
184
156
  - - "<"
185
157
  - !ruby/object:Gem::Version
186
- version: '6.1'
158
+ version: '6.2'
187
159
  description:
188
160
  email:
189
161
  - mick@zendesk.com
@@ -227,15 +199,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
227
199
  requirements:
228
200
  - - ">="
229
201
  - !ruby/object:Gem::Version
230
- version: 2.2.0
202
+ version: 2.5.0
231
203
  required_rubygems_version: !ruby/object:Gem::Requirement
232
204
  requirements:
233
205
  - - ">="
234
206
  - !ruby/object:Gem::Version
235
207
  version: '0'
236
208
  requirements: []
237
- rubyforge_project:
238
- rubygems_version: 2.7.6
209
+ rubygems_version: 3.0.3.1
239
210
  signing_key:
240
211
  specification_version: 4
241
212
  summary: Type checking and type casting of parameters for Action Pack