activemodel 7.2.0.beta2 → 7.2.0.beta3

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: fcba13dc67fffbbc777417b4e5778805208184f14923bf2ac225d682c8bd8e4f
4
- data.tar.gz: e5ca96e2d9bfe3e1c8ce506529524c79568a7bd1602bb25003c541a8ebb52f8e
3
+ metadata.gz: 396169eea4f8612b0db751778ec46eeed05e2fc4dfeefb5b8762a5e6e2589ae4
4
+ data.tar.gz: '09d668e0a70dd17d0504dff67f5604f721afa8d513dac77d2d7cc34305218d76'
5
5
  SHA512:
6
- metadata.gz: 3c96c9b7ee0214df39556f148840fbde844b15e2ea757a75381cb21451e270b6d2c2e16786d3b3c560878346d2d4ad43be3d48c3bd80e7cf9c1858e19b427d6e
7
- data.tar.gz: 26dcd62bdaf43519f236efbdf8c8f44fe4f2ef9e64e68781431c559cb6095008f44824cf05d20bd24efe06c6696def2122d7ca4759d769358fe83871fd50deea
6
+ metadata.gz: d6a9d8fd13108700abf7c304abf11096b7e18e7dcd22f4362dd408ededdc688792fd1345f611300fa6455633881c55a712d39efa265852e26a54ab543f4daaee
7
+ data.tar.gz: 3f29c7beb890c1c8f364538ad3a98cd63f054bde1610bfc35258eea8af108873f9e4ab4612b13a51f82784fe5954a0ce097f1ddc581cac679901a7154b4ca245
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## Rails 7.2.0.beta3 (July 11, 2024) ##
2
+
3
+ * No changes.
4
+
5
+
1
6
  ## Rails 7.2.0.beta2 (June 04, 2024) ##
2
7
 
3
8
  * No changes.
@@ -215,9 +215,7 @@ module ActiveModel
215
215
  end
216
216
 
217
217
  def generate_alias_attribute_methods(code_generator, new_name, old_name)
218
- attribute_method_patterns.each do |pattern|
219
- alias_attribute_method_definition(code_generator, pattern, new_name, old_name)
220
- end
218
+ define_attribute_method(old_name, _owner: code_generator, as: new_name)
221
219
  end
222
220
 
223
221
  def alias_attribute_method_definition(code_generator, pattern, new_name, old_name) # :nodoc:
@@ -305,25 +303,45 @@ module ActiveModel
305
303
  # person.name = 'Bob'
306
304
  # person.name # => "Bob"
307
305
  # person.name_short? # => true
308
- def define_attribute_method(attr_name, _owner: generated_attribute_methods)
306
+ def define_attribute_method(attr_name, _owner: generated_attribute_methods, as: attr_name)
309
307
  ActiveSupport::CodeGenerator.batch(_owner, __FILE__, __LINE__) do |owner|
310
308
  attribute_method_patterns.each do |pattern|
311
- method_name = pattern.method_name(attr_name)
312
-
313
- unless instance_method_already_implemented?(method_name)
314
- generate_method = "define_method_#{pattern.proxy_target}"
315
-
316
- if respond_to?(generate_method, true)
317
- send(generate_method, attr_name.to_s, owner: owner)
318
- else
319
- define_proxy_call(owner, method_name, pattern.proxy_target, pattern.parameters, attr_name.to_s, namespace: :active_model_proxy)
320
- end
321
- end
309
+ define_attribute_method_pattern(pattern, attr_name, owner: owner, as: as)
322
310
  end
323
311
  attribute_method_patterns_cache.clear
324
312
  end
325
313
  end
326
314
 
315
+ def define_attribute_method_pattern(pattern, attr_name, owner:, as:, override: false) # :nodoc:
316
+ canonical_method_name = pattern.method_name(attr_name)
317
+ public_method_name = pattern.method_name(as)
318
+
319
+ # If defining a regular attribute method, we don't override methods that are explictly
320
+ # defined in parrent classes.
321
+ if instance_method_already_implemented?(public_method_name)
322
+ # However, for `alias_attribute`, we always define the method.
323
+ # We check for override second because `instance_method_already_implemented?`
324
+ # also check for dangerous methods.
325
+ return unless override
326
+ end
327
+
328
+ generate_method = "define_method_#{pattern.proxy_target}"
329
+
330
+ if respond_to?(generate_method, true)
331
+ send(generate_method, attr_name.to_s, owner: owner, as: as)
332
+ else
333
+ define_proxy_call(
334
+ owner,
335
+ canonical_method_name,
336
+ pattern.proxy_target,
337
+ pattern.parameters,
338
+ attr_name.to_s,
339
+ namespace: :active_model_proxy,
340
+ as: public_method_name
341
+ )
342
+ end
343
+ end
344
+
327
345
  # Removes all the previously dynamically defined methods from the class, including alias attribute methods.
328
346
  #
329
347
  # class Person
@@ -404,14 +422,19 @@ module ActiveModel
404
422
  # Define a method `name` in `mod` that dispatches to `send`
405
423
  # using the given `extra` args. This falls back on `send`
406
424
  # if the called name cannot be compiled.
407
- def define_proxy_call(code_generator, name, proxy_target, parameters, *call_args, namespace:)
425
+ def define_proxy_call(code_generator, name, proxy_target, parameters, *call_args, namespace:, as: name)
408
426
  mangled_name = build_mangled_name(name)
409
427
 
410
428
  call_args.map!(&:inspect)
411
429
  call_args << parameters if parameters
412
- namespace = :"#{namespace}_#{proxy_target}_#{call_args.join("_")}}"
413
430
 
414
- define_call(code_generator, name, proxy_target, mangled_name, parameters, call_args, namespace: namespace)
431
+ # We have to use a different namespace for every target method, because
432
+ # if someone defines an attribute that look like an attribute method we could clash, e.g.
433
+ # attribute :title_was
434
+ # attribute :title
435
+ namespace = :"#{namespace}_#{proxy_target}"
436
+
437
+ define_call(code_generator, name, proxy_target, mangled_name, parameters, call_args, namespace: namespace, as: as)
415
438
  end
416
439
 
417
440
  def build_mangled_name(name)
@@ -424,8 +447,8 @@ module ActiveModel
424
447
  mangled_name
425
448
  end
426
449
 
427
- def define_call(code_generator, name, target_name, mangled_name, parameters, call_args, namespace:)
428
- code_generator.define_cached_method(name, as: mangled_name, namespace: namespace) do |batch|
450
+ def define_call(code_generator, name, target_name, mangled_name, parameters, call_args, namespace:, as:)
451
+ code_generator.define_cached_method(mangled_name, as: as, namespace: namespace) do |batch|
429
452
  body = if CALL_COMPILABLE_REGEXP.match?(target_name)
430
453
  "self.#{target_name}(#{call_args.join(", ")})"
431
454
  else
@@ -89,11 +89,11 @@ module ActiveModel
89
89
 
90
90
  ##
91
91
  private
92
- def define_method_attribute=(name, owner:)
92
+ def define_method_attribute=(canonical_name, owner:, as: canonical_name)
93
93
  ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method(
94
- owner, name, writer: true,
94
+ owner, canonical_name, writer: true,
95
95
  ) do |temp_method_name, attr_name_expr|
96
- owner.define_cached_method("#{name}=", as: temp_method_name, namespace: :active_model) do |batch|
96
+ owner.define_cached_method(temp_method_name, as: "#{as}=", namespace: :active_model) do |batch|
97
97
  batch <<
98
98
  "def #{temp_method_name}(value)" <<
99
99
  " _write_attribute(#{attr_name_expr}, value)" <<
@@ -10,7 +10,7 @@ module ActiveModel
10
10
  MAJOR = 7
11
11
  MINOR = 2
12
12
  TINY = 0
13
- PRE = "beta2"
13
+ PRE = "beta3"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
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: 7.2.0.beta2
4
+ version: 7.2.0.beta3
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-06-04 00:00:00.000000000 Z
11
+ date: 2024-07-11 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: 7.2.0.beta2
19
+ version: 7.2.0.beta3
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: 7.2.0.beta2
26
+ version: 7.2.0.beta3
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/v7.2.0.beta2/activemodel/CHANGELOG.md
116
- documentation_uri: https://api.rubyonrails.org/v7.2.0.beta2/
115
+ changelog_uri: https://github.com/rails/rails/blob/v7.2.0.beta3/activemodel/CHANGELOG.md
116
+ documentation_uri: https://api.rubyonrails.org/v7.2.0.beta3/
117
117
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
118
- source_code_uri: https://github.com/rails/rails/tree/v7.2.0.beta2/activemodel
118
+ source_code_uri: https://github.com/rails/rails/tree/v7.2.0.beta3/activemodel
119
119
  rubygems_mfa_required: 'true'
120
120
  post_install_message:
121
121
  rdoc_options: []
@@ -128,11 +128,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
128
  version: 3.1.0
129
129
  required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - ">"
131
+ - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: 1.3.1
133
+ version: '0'
134
134
  requirements: []
135
- rubygems_version: 3.3.27
135
+ rubygems_version: 3.5.11
136
136
  signing_key:
137
137
  specification_version: 4
138
138
  summary: A toolkit for building modeling frameworks (part of Rails).