activemodel 8.0.0.beta1 → 8.0.0.rc2

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: 906d52ef894a9f6b8fc0eb97488a653bcf0c0b141747cf7a7d5e8dcedb65e929
4
- data.tar.gz: '084df4c1c4a669a5d5c583bb3a579fdbe1be8f7f2bc4c24506797f9197250d3f'
3
+ metadata.gz: fe86b869064247ef19c8c715e9c0488388d6560596263be3da35e496da95d1bc
4
+ data.tar.gz: bacf541e392054fe3d8db5c23f2ef572ffb9423594aac67ac80797a102f99fec
5
5
  SHA512:
6
- metadata.gz: acdcc972d445a2d7576785d1b145d66f2a895a9e21e6b17acdc5ef78871e49aea0a49694d92efce03c030b82e69b176298ced1eb8244bdd836151dd9dfaa5068
7
- data.tar.gz: 918efc3fb79b912bfbff1661cfec5f822d86f2c33a135389de8f8bba150196c85411db87fb17470bccfea852ff3cda3c5c19bdc336d85238040f99ee0374138d
6
+ metadata.gz: 3be677d21f7ad823f4ced7c283159fdf9e4a3a74f806d68b80dfb4683965099e975c7fa56a4b35e520690d25c1a62c0d690ffe9a67ccd050708cb946631dd1a8
7
+ data.tar.gz: 73546bdd04dc2ca32cfd3a1a006cda6e1c4ea0922a9697c4bc72f64c62cc2d79cb774695f4b11d4dc07121ebc4d04cf743834b1d01a209e1614b7a1230f0173a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## Rails 8.0.0.rc2 (October 30, 2024) ##
2
+
3
+ * No changes.
4
+
5
+
6
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
7
+
8
+ * Add `:except_on` option for validations. Grants the ability to _skip_ validations in specified contexts.
9
+
10
+ ```ruby
11
+ class User < ApplicationRecord
12
+ #...
13
+ validates :birthday, presence: { except_on: :admin }
14
+ #...
15
+ end
16
+
17
+ user = User.new(attributes except birthday)
18
+ user.save(context: :admin)
19
+ ```
20
+
21
+ *Drew Bragg*
22
+
1
23
  ## Rails 8.0.0.beta1 (September 26, 2024) ##
2
24
 
3
25
  * Make `ActiveModel::Serialization#read_attribute_for_serialization` public
@@ -71,7 +71,7 @@ module ActiveModel
71
71
  end
72
72
 
73
73
  def deep_dup
74
- AttributeSet.new(attributes.deep_dup)
74
+ AttributeSet.new(attributes.transform_values(&:deep_dup))
75
75
  end
76
76
 
77
77
  def initialize_dup(_)
@@ -3,7 +3,7 @@
3
3
  module ActiveModel
4
4
  # = Active \Model \Conversion
5
5
  #
6
- # Handles default conversions: to_model, to_key, to_param, and to_partial_path.
6
+ # Handles default conversions: #to_model, #to_key, #to_param, and #to_partial_path.
7
7
  #
8
8
  # Let's take for example this non-persisted object.
9
9
  #
@@ -247,12 +247,18 @@ module ActiveModel
247
247
 
248
248
  def initialize_dup(other) # :nodoc:
249
249
  super
250
- if self.class.respond_to?(:_default_attributes)
251
- @attributes = self.class._default_attributes.map do |attr|
252
- attr.with_value_from_user(@attributes.fetch_value(attr.name))
250
+ @mutations_from_database = nil
251
+ end
252
+
253
+ def init_attributes(other) # :nodoc:
254
+ attrs = super
255
+ if other.persisted? && self.class.respond_to?(:_default_attributes)
256
+ self.class._default_attributes.map do |attr|
257
+ attr.with_value_from_user(attrs.fetch_value(attr.name))
253
258
  end
259
+ else
260
+ attrs
254
261
  end
255
- @mutations_from_database = nil
256
262
  end
257
263
 
258
264
  def as_json(options = {}) # :nodoc:
@@ -10,7 +10,7 @@ module ActiveModel
10
10
  MAJOR = 8
11
11
  MINOR = 0
12
12
  TINY = 0
13
- PRE = "beta1"
13
+ PRE = "rc2"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -114,8 +114,8 @@ module ActiveModel
114
114
  false
115
115
  end
116
116
 
117
- def map(value) # :nodoc:
118
- yield value
117
+ def map(value, &) # :nodoc:
118
+ value
119
119
  end
120
120
 
121
121
  def ==(other)
@@ -78,7 +78,12 @@ module ActiveModel
78
78
  # or an array of symbols. (e.g. <tt>on: :create</tt> or
79
79
  # <tt>on: :custom_validation_context</tt> or
80
80
  # <tt>on: [:create, :custom_validation_context]</tt>)
81
- # * <tt>:if</tt> - Specifies a method, proc, or string to call to determine
81
+ # * <tt>:except_on</tt> - Specifies the contexts where this validation is not active.
82
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
83
+ # or an array of symbols. (e.g. <tt>except: :create</tt> or
84
+ # <tt>except_on: :custom_validation_context</tt> or
85
+ # <tt>except_on: [:create, :custom_validation_context]</tt>)
86
+ # * <tt>:if</tt> - Specifies a method, proc or string to call to determine
82
87
  # if the validation should occur (e.g. <tt>if: :allow_validation</tt>,
83
88
  # or <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method,
84
89
  # proc or string should return or evaluate to a +true+ or +false+ value.
@@ -155,7 +160,7 @@ module ActiveModel
155
160
  # When creating custom validators, it might be useful to be able to specify
156
161
  # additional default keys. This can be done by overwriting this method.
157
162
  def _validates_default_keys
158
- [:if, :unless, :on, :allow_blank, :allow_nil, :strict]
163
+ [:if, :unless, :on, :allow_blank, :allow_nil, :strict, :except_on]
159
164
  end
160
165
 
161
166
  def _parse_validates_options(options)
@@ -69,6 +69,11 @@ module ActiveModel
69
69
  # or an array of symbols. (e.g. <tt>on: :create</tt> or
70
70
  # <tt>on: :custom_validation_context</tt> or
71
71
  # <tt>on: [:create, :custom_validation_context]</tt>)
72
+ # * <tt>:except_on</tt> - Specifies the contexts where this validation is not active.
73
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
74
+ # or an array of symbols. (e.g. <tt>except: :create</tt> or
75
+ # <tt>except_on: :custom_validation_context</tt> or
76
+ # <tt>except_on: [:create, :custom_validation_context]</tt>)
72
77
  # * <tt>:allow_nil</tt> - Skip validation if attribute is +nil+.
73
78
  # * <tt>:allow_blank</tt> - Skip validation if attribute is blank.
74
79
  # * <tt>:if</tt> - Specifies a method, proc, or string to call to determine
@@ -84,7 +89,7 @@ module ActiveModel
84
89
  validates_with BlockValidator, _merge_attributes(attr_names), &block
85
90
  end
86
91
 
87
- VALID_OPTIONS_FOR_VALIDATE = [:on, :if, :unless, :prepend].freeze # :nodoc:
92
+ VALID_OPTIONS_FOR_VALIDATE = [:on, :if, :unless, :prepend, :except_on].freeze # :nodoc:
88
93
 
89
94
  # Adds a validation method or block to the class. This is useful when
90
95
  # overriding the +validate+ instance method becomes too unwieldy and
@@ -135,7 +140,12 @@ module ActiveModel
135
140
  # or an array of symbols. (e.g. <tt>on: :create</tt> or
136
141
  # <tt>on: :custom_validation_context</tt> or
137
142
  # <tt>on: [:create, :custom_validation_context]</tt>)
138
- # * <tt>:if</tt> - Specifies a method, proc, or string to call to determine
143
+ # * <tt>:except_on</tt> - Specifies the contexts where this validation is not active.
144
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
145
+ # or an array of symbols. (e.g. <tt>except: :create</tt> or
146
+ # <tt>except_on: :custom_validation_context</tt> or
147
+ # <tt>except_on: [:create, :custom_validation_context]</tt>)
148
+ # * <tt>:if</tt> - Specifies a method, proc or string to call to determine
139
149
  # if the validation should occur (e.g. <tt>if: :allow_validation</tt>,
140
150
  # or <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method,
141
151
  # proc or string should return or evaluate to a +true+ or +false+ value.
@@ -162,6 +172,15 @@ module ActiveModel
162
172
  options = options.merge(if: [predicate_for_validation_context(options[:on]), *options[:if]])
163
173
  end
164
174
 
175
+ if options.key?(:except_on)
176
+ options = options.dup
177
+ options[:except_on] = Array(options[:except_on])
178
+ options[:unless] = [
179
+ ->(o) { (options[:except_on] & Array(o.validation_context)).any? },
180
+ *options[:unless]
181
+ ]
182
+ end
183
+
165
184
  set_callback(:validate, *args, options, &block)
166
185
  end
167
186
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0.beta1
4
+ version: 8.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-26 00:00:00.000000000 Z
11
+ date: 2024-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 8.0.0.beta1
19
+ version: 8.0.0.rc2
20
20
  type: :runtime
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: 8.0.0.beta1
26
+ version: 8.0.0.rc2
27
27
  description: A toolkit for building modeling frameworks like Active Record. Rich support
28
28
  for attributes, callbacks, validations, serialization, internationalization, and
29
29
  testing.
@@ -112,10 +112,10 @@ licenses:
112
112
  - MIT
113
113
  metadata:
114
114
  bug_tracker_uri: https://github.com/rails/rails/issues
115
- changelog_uri: https://github.com/rails/rails/blob/v8.0.0.beta1/activemodel/CHANGELOG.md
116
- documentation_uri: https://api.rubyonrails.org/v8.0.0.beta1/
115
+ changelog_uri: https://github.com/rails/rails/blob/v8.0.0.rc2/activemodel/CHANGELOG.md
116
+ documentation_uri: https://api.rubyonrails.org/v8.0.0.rc2/
117
117
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
118
- source_code_uri: https://github.com/rails/rails/tree/v8.0.0.beta1/activemodel
118
+ source_code_uri: https://github.com/rails/rails/tree/v8.0.0.rc2/activemodel
119
119
  rubygems_mfa_required: 'true'
120
120
  post_install_message:
121
121
  rdoc_options: []