granite-form 0.6.0 → 0.6.1

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: 7a1314ba3c2ba30bdc16261970529bae85d79d96c49f54fb445c350e6f828532
4
- data.tar.gz: a868509fd29600d0c94ec7de9e20c584b1caf29d985f5e6a7334ffeb0df6a2ac
3
+ metadata.gz: 62a7935cb1b74f15d4599c3118e4b60728bcf8b27dac232a3893ef84d2b5f127
4
+ data.tar.gz: 2c6e8d0aeca6ca09aae7a364d2966a26c1ad1a4ab7f9986d348deeaab7688bdb
5
5
  SHA512:
6
- metadata.gz: 27ad9896a8c1e282a220051ff2eac56bbcaa97cf4c378bceb26779051b36a888623b33aad6be0b30c1810efdb032c182f575fb9caf4e0c9fcc2ce9591d72d957
7
- data.tar.gz: c989dc6d3e3f96597780d9b84ea0137cc1345a70047f56c400c0e3ca79900fe0b92f057b8be977390cf1ef75aef05154431e9b974351fe343b1fc55c8fa5b784
6
+ metadata.gz: 1545d76b21d34005b22708aa3670f7c893d322b388f217f70d21180d0dfa65621f694d87025e1b8c0fd243f97139b5f2e1a0c101a536c01750f3eba741ad0327
7
+ data.tar.gz: 0dbf480f6d6d8ebc4401ad698d3adfe8b894a2f07f6b32b9fdff0f3bc60605d7a97da1c305877db248f4a6005aebb836fa8000f22fb3c5096231e044d0491144
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## Next
4
4
 
5
+ ## v0.6.1
6
+
7
+ * Introduces `mass_assignment_strict_mode` configuration option to control the behavior of mass assignment.
8
+ * The setting is per class and configures strict handling of unknown attributes by raising an exception.
9
+ * By default it is disabled, and you need to opt-in.
10
+ * https://github.com/toptal/granite-form/pull/32
11
+
5
12
  ## v0.6.0
6
13
 
7
14
  * Fix crash when mapping PostgreSQL enum to ruby variable in https://github.com/toptal/granite-form/pull/28
@@ -16,10 +16,13 @@ module Granite
16
16
  extend ActiveSupport::Concern
17
17
 
18
18
  included do
19
- class_attribute :_attributes, :_attribute_aliases, :_sanitize, instance_reader: false, instance_writer: false
19
+ class_attribute :_attributes, :_attribute_aliases, :_sanitize,
20
+ :mass_assignment_strict_mode,
21
+ instance_reader: false, instance_writer: false
20
22
  self._attributes = {}
21
23
  self._attribute_aliases = {}
22
24
  self._sanitize = true
25
+ self.mass_assignment_strict_mode = false
23
26
 
24
27
  delegate :attribute_names, :has_attribute?, to: 'self.class'
25
28
 
@@ -180,7 +183,7 @@ module Granite
180
183
  public_send("#{name}=", value)
181
184
  else
182
185
  attribute_type = sanitize_value ? 'primary' : 'undefined'
183
- logger.debug("Ignoring #{attribute_type} `#{name}` attribute value for #{self} during mass-assignment")
186
+ report_unknown_attribute(attribute_type, name)
184
187
  end
185
188
  end
186
189
  end
@@ -208,6 +211,12 @@ module Granite
208
211
 
209
212
  private
210
213
 
214
+ def report_unknown_attribute(attribute_type, name)
215
+ raise ActiveModel::UnknownAttributeError.new(self, name.to_s) if self.class.mass_assignment_strict_mode
216
+
217
+ logger.debug("Ignoring #{attribute_type} `#{name}` attribute value for #{self} during mass-assignment")
218
+ end
219
+
211
220
  def attributes_for_inspect
212
221
  attribute_names(false).map do |name|
213
222
  prefix = self.class.primary_name == name ? '*' : ''
@@ -1,5 +1,5 @@
1
1
  module Granite
2
2
  module Form
3
- VERSION = '0.6.0'.freeze
3
+ VERSION = '0.6.1'.freeze
4
4
  end
5
5
  end
@@ -206,6 +206,27 @@ describe Granite::Form::Model::Attributes do
206
206
  end
207
207
  end
208
208
  end
209
+
210
+ context 'with mass_assignment_strict_mode' do
211
+ let(:model) do
212
+ stub_model do
213
+ self.mass_assignment_strict_mode = true
214
+ attribute :full_name, String
215
+ alias_attribute :name, :full_name
216
+ end
217
+ end
218
+
219
+ specify do
220
+ expect do
221
+ subject.assign_attributes(name: 'name', unexisting: 'value')
222
+ end.to raise_error(ActiveModel::UnknownAttributeError, /unknown attribute 'unexisting' for/)
223
+ end
224
+
225
+ specify do
226
+ subject.assign_attributes(name: 'name', full_name: 'full_name')
227
+ expect(subject.name).to eq('full_name')
228
+ end
229
+ end
209
230
  end
210
231
 
211
232
  describe '#sync_attributes' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: granite-form
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toptal Engineering
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-31 00:00:00.000000000 Z
11
+ date: 2024-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -221,13 +221,12 @@ dependencies:
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  description: Making object from any hash or hash array
224
- email:
224
+ email:
225
225
  executables: []
226
226
  extensions: []
227
227
  extra_rdoc_files: []
228
228
  files:
229
229
  - ".codeclimate.yml"
230
- - ".github/CODEOWNERS"
231
230
  - ".github/workflows/ruby.yml"
232
231
  - ".gitignore"
233
232
  - ".rspec"
@@ -392,7 +391,7 @@ files:
392
391
  homepage: https://github.com/toptal/granite-form
393
392
  licenses: []
394
393
  metadata: {}
395
- post_install_message:
394
+ post_install_message:
396
395
  rdoc_options: []
397
396
  require_paths:
398
397
  - lib
@@ -407,8 +406,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
407
406
  - !ruby/object:Gem::Version
408
407
  version: '0'
409
408
  requirements: []
410
- rubygems_version: 3.5.9
411
- signing_key:
409
+ rubygems_version: 3.4.19
410
+ signing_key:
412
411
  specification_version: 4
413
412
  summary: Working with hashes in AR style
414
413
  test_files:
data/.github/CODEOWNERS DELETED
@@ -1 +0,0 @@
1
- * @toptal/devx