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 +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/active_model/attribute_methods.rb +43 -20
- data/lib/active_model/attributes.rb +3 -3
- data/lib/active_model/gem_version.rb +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 396169eea4f8612b0db751778ec46eeed05e2fc4dfeefb5b8762a5e6e2589ae4
|
4
|
+
data.tar.gz: '09d668e0a70dd17d0504dff67f5604f721afa8d513dac77d2d7cc34305218d76'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6a9d8fd13108700abf7c304abf11096b7e18e7dcd22f4362dd408ededdc688792fd1345f611300fa6455633881c55a712d39efa265852e26a54ab543f4daaee
|
7
|
+
data.tar.gz: 3f29c7beb890c1c8f364538ad3a98cd63f054bde1610bfc35258eea8af108873f9e4ab4612b13a51f82784fe5954a0ce097f1ddc581cac679901a7154b4ca245
|
data/CHANGELOG.md
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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(
|
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=(
|
92
|
+
def define_method_attribute=(canonical_name, owner:, as: canonical_name)
|
93
93
|
ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method(
|
94
|
-
owner,
|
94
|
+
owner, canonical_name, writer: true,
|
95
95
|
) do |temp_method_name, attr_name_expr|
|
96
|
-
owner.define_cached_method("#{
|
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)" <<
|
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.
|
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-
|
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.
|
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.
|
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.
|
116
|
-
documentation_uri: https://api.rubyonrails.org/v7.2.0.
|
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.
|
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:
|
133
|
+
version: '0'
|
134
134
|
requirements: []
|
135
|
-
rubygems_version: 3.
|
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).
|