activerecord 6.1.4.6 → 6.1.6.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +134 -12
  3. data/MIT-LICENSE +1 -1
  4. data/lib/active_record/associations/collection_association.rb +16 -8
  5. data/lib/active_record/associations/preloader/association.rb +1 -3
  6. data/lib/active_record/coders/yaml_column.rb +9 -7
  7. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +1 -1
  8. data/lib/active_record/connection_adapters/abstract/quoting.rb +3 -3
  9. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +4 -0
  10. data/lib/active_record/connection_adapters/mysql/database_statements.rb +2 -0
  11. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +4 -1
  12. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +2 -0
  13. data/lib/active_record/connection_adapters/schema_cache.rb +34 -10
  14. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +2 -0
  15. data/lib/active_record/connection_handling.rb +2 -2
  16. data/lib/active_record/core.rb +10 -2
  17. data/lib/active_record/database_configurations/connection_url_resolver.rb +1 -0
  18. data/lib/active_record/database_configurations/hash_config.rb +1 -1
  19. data/lib/active_record/database_configurations.rb +2 -1
  20. data/lib/active_record/gem_version.rb +2 -2
  21. data/lib/active_record/internal_metadata.rb +2 -0
  22. data/lib/active_record/legacy_yaml_adapter.rb +1 -1
  23. data/lib/active_record/migration/compatibility.rb +9 -6
  24. data/lib/active_record/model_schema.rb +1 -1
  25. data/lib/active_record/railtie.rb +18 -0
  26. data/lib/active_record/railties/databases.rake +8 -8
  27. data/lib/active_record/relation/calculations.rb +2 -2
  28. data/lib/active_record/relation/finder_methods.rb +1 -1
  29. data/lib/active_record/relation/query_methods.rb +2 -2
  30. data/lib/active_record/relation/where_clause.rb +2 -2
  31. data/lib/active_record/tasks/database_tasks.rb +1 -1
  32. data/lib/active_record.rb +1 -1
  33. metadata +11 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2f87e3cc714dae6cd647f849d95fbf9dcc5557ae111d1353deaf0ba554018f0
4
- data.tar.gz: eb4f7b6ab54b38b5f30f7641885881679296350ff06b097d8f94a41c93b259d2
3
+ metadata.gz: 2093e13defc611f0ec1e62d7efd445bcd1c5b182d8aab24f3dd3625047ce2f9f
4
+ data.tar.gz: 8d3e9a6daab9d0026cc1826d1caf2f24fee239d05b63cbb0eac866b1daded767
5
5
  SHA512:
6
- metadata.gz: 13eb85644839a913b647d8fbb8e635008aca0b10afc31598985841c6c915773195eb9176934ce8bd2ecbb63506a54a9e3137a53b3a24b459c7c4cec59e8d9922
7
- data.tar.gz: caff9b3a5be2a7ba7b1829556556d09bdff63695b1dba58ff94d66115b5a66b7178bf6ca3210b82254c37fe6176b1ada4c6b5082887819c5e8383fb1e7356b51
6
+ metadata.gz: 3e6be64f1492b2441290abac0af6cde31950acef133ccdd98202b2ab719dc48b0f969eda318b4712c508cde2f29b3a6c381c27c6e7467b4ee25ec97209717d7a
7
+ data.tar.gz: 924c8bcbbaa608deb02263437e76947737b041b39a86818585e3d087530f0d1e3fdc537fc10d1177fe6cf2413deaf47f655342435312a5d473a4789e7a35631f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,125 @@
1
+ ## Rails 6.1.6.1 (July 12, 2022) ##
2
+
3
+ * Change ActiveRecord::Coders::YAMLColumn default to safe_load
4
+
5
+ This adds two new configuration options The configuration options are as
6
+ follows:
7
+
8
+ * `config.active_storage.use_yaml_unsafe_load`
9
+
10
+ When set to true, this configuration option tells Rails to use the old
11
+ "unsafe" YAML loading strategy, maintaining the existing behavior but leaving
12
+ the possible escalation vulnerability in place. Setting this option to true
13
+ is *not* recommended, but can aid in upgrading.
14
+
15
+ * `config.active_record.yaml_column_permitted_classes`
16
+
17
+ The "safe YAML" loading method does not allow all classes to be deserialized
18
+ by default. This option allows you to specify classes deemed "safe" in your
19
+ application. For example, if your application uses Symbol and Time in
20
+ serialized data, you can add Symbol and Time to the allowed list as follows:
21
+
22
+ ```
23
+ config.active_record.yaml_column_permitted_classes = [Symbol, Date, Time]
24
+ ```
25
+
26
+ [CVE-2022-32224]
27
+
28
+
29
+ ## Rails 6.1.5.1 (April 26, 2022) ##
30
+
31
+ * No changes.
32
+
33
+
34
+ ## Rails 6.1.5 (March 09, 2022) ##
35
+
36
+ * Fix `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` for Ruby 2.6.
37
+
38
+ Ruby 2.6 and 2.7 have slightly different implementations of the `String#-@` method.
39
+ In Ruby 2.6, the receiver of the `String#-@` method is modified under certain circumstances.
40
+ This was later identified as a bug (https://bugs.ruby-lang.org/issues/15926) and only
41
+ fixed in Ruby 2.7.
42
+
43
+ Before the changes in this commit, the
44
+ `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` method, which internally
45
+ calls the `String#-@` method, could also modify an input string argument in Ruby 2.6 --
46
+ changing a tainted, unfrozen string into a tainted, frozen string.
47
+
48
+ Fixes #43056
49
+
50
+ *Eric O'Hanlon*
51
+
52
+ * Fix migration compatibility to create SQLite references/belongs_to column as integer when
53
+ migration version is 6.0.
54
+
55
+ `reference`/`belongs_to` in migrations with version 6.0 were creating columns as
56
+ bigint instead of integer for the SQLite Adapter.
57
+
58
+ *Marcelo Lauxen*
59
+
60
+ * Fix dbconsole for 3-tier config.
61
+
62
+ *Eileen M. Uchitelle*
63
+
64
+ * Better handle SQL queries with invalid encoding.
65
+
66
+ ```ruby
67
+ Post.create(name: "broken \xC8 UTF-8")
68
+ ```
69
+
70
+ Would cause all adapters to fail in a non controlled way in the code
71
+ responsible to detect write queries.
72
+
73
+ The query is now properly passed to the database connection, which might or might
74
+ not be able to handle it, but will either succeed or failed in a more correct way.
75
+
76
+ *Jean Boussier*
77
+
78
+ * Ignore persisted in-memory records when merging target lists.
79
+
80
+ *Kevin Sjöberg*
81
+
82
+ * Fix regression bug that caused ignoring additional conditions for preloading
83
+ `has_many` through relations.
84
+
85
+ Fixes #43132
86
+
87
+ *Alexander Pauly*
88
+
89
+ * Fix `ActiveRecord::InternalMetadata` to not be broken by
90
+ `config.active_record.record_timestamps = false`
91
+
92
+ Since the model always create the timestamp columns, it has to set them, otherwise it breaks
93
+ various DB management tasks.
94
+
95
+ Fixes #42983
96
+
97
+ *Jean Boussier*
98
+
99
+ * Fix duplicate active record objects on `inverse_of`.
100
+
101
+ *Justin Carvalho*
102
+
103
+ * Fix duplicate objects stored in has many association after save.
104
+
105
+ Fixes #42549.
106
+
107
+ *Alex Ghiculescu*
108
+
109
+ * Fix performance regression in `CollectionAssocation#build`.
110
+
111
+ *Alex Ghiculescu*
112
+
113
+ * Fix retrieving default value for text column for MariaDB.
114
+
115
+ *fatkodima*
116
+
117
+
118
+ ## Rails 6.1.4.7 (March 08, 2022) ##
119
+
120
+ * No changes.
121
+
122
+
1
123
  ## Rails 6.1.4.6 (February 11, 2022) ##
2
124
 
3
125
  * No changes.
@@ -97,10 +219,10 @@
97
219
  ```
98
220
 
99
221
  In the example, `dog.treats` would still raise even though
100
- `strict_loading` was set to false. This is a bug effecting more than
101
- Active Storage which is why I made this PR superceeding #41461. We need
222
+ `strict_loading` was set to false. This is a bug affecting more than
223
+ Active Storage which is why I made this PR superseding #41461. We need
102
224
  to fix this for all applications since the behavior is a little
103
- surprising. I took the test from ##41461 and the code suggestion from #41453
225
+ surprising. I took the test from #41461 and the code suggestion from #41453
104
226
  with some additions.
105
227
 
106
228
  *Eileen M. Uchitelle*, *Radamés Roriz*
@@ -602,7 +724,7 @@
602
724
 
603
725
  attribute :duration, :interval
604
726
 
605
- To keep old behavior until 6.2 is released:
727
+ To keep old behavior until 7.0 is released:
606
728
 
607
729
  attribute :duration, :string
608
730
 
@@ -774,8 +896,8 @@
774
896
  *Ryuta Kamizono*
775
897
 
776
898
  * Merging conditions on the same column no longer maintain both conditions,
777
- and will be consistently replaced by the latter condition in Rails 6.2.
778
- To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
899
+ and will be consistently replaced by the latter condition in Rails 7.0.
900
+ To migrate to Rails 7.0's behavior, use `relation.merge(other, rewhere: true)`.
779
901
 
780
902
  ```ruby
781
903
  # Rails 6.1 (IN clause is replaced by merger side equality condition)
@@ -784,10 +906,10 @@
784
906
  # Rails 6.1 (both conflict conditions exists, deprecated)
785
907
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
786
908
 
787
- # Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
909
+ # Rails 6.1 with rewhere to migrate to Rails 7.0's behavior
788
910
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
789
911
 
790
- # Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
912
+ # Rails 7.0 (same behavior with IN clause, mergee side condition is consistently replaced)
791
913
  Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
792
914
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
793
915
  ```
@@ -879,7 +1001,7 @@
879
1001
 
880
1002
  * Deprecate aggregations with group by duplicated fields.
881
1003
 
882
- To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
1004
+ To migrate to Rails 7.0's behavior, use `uniq!(:group)` to deduplicate group fields.
883
1005
 
884
1006
  ```ruby
885
1007
  accounts = Account.group(:firm_id)
@@ -903,7 +1025,7 @@
903
1025
 
904
1026
  * Deprecate duplicated query annotations.
905
1027
 
906
- To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
1028
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
907
1029
 
908
1030
  ```ruby
909
1031
  accounts = Account.where(id: [1, 2]).annotate("david and mary")
@@ -1324,13 +1446,13 @@
1324
1446
 
1325
1447
  * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
1326
1448
 
1327
- `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in 6.2.
1449
+ `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in Rails 7.0.
1328
1450
 
1329
1451
  *Eileen M. Uchitelle*, *John Crepezzi*
1330
1452
 
1331
1453
  * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
1332
1454
 
1333
- Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
1455
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in Rails 7.0.
1334
1456
 
1335
1457
  *Eileen M. Uchitelle*, *John Crepezzi*
1336
1458
 
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2020 David Heinemeier Hansson
1
+ Copyright (c) 2004-2022 David Heinemeier Hansson
2
2
 
3
3
  Arel originally copyright (c) 2007-2016 Nick Kallen, Bryan Helmkamp, Emilio Tagua, Aaron Patterson
4
4
 
@@ -75,6 +75,7 @@ module ActiveRecord
75
75
  def reset
76
76
  super
77
77
  @target = []
78
+ @replaced_or_added_targets = Set.new
78
79
  @association_ids = nil
79
80
  end
80
81
 
@@ -279,10 +280,7 @@ module ActiveRecord
279
280
  end
280
281
 
281
282
  def add_to_target(record, skip_callbacks: false, replace: false, &block)
282
- if replace || association_scope.distinct_value
283
- index = @target.index(record)
284
- end
285
- replace_on_target(record, index, skip_callbacks, &block)
283
+ replace_on_target(record, skip_callbacks, replace: replace || association_scope.distinct_value, &block)
286
284
  end
287
285
 
288
286
  def target=(record)
@@ -292,7 +290,7 @@ module ActiveRecord
292
290
  when Array
293
291
  super
294
292
  else
295
- add_to_target(record, skip_callbacks: true, replace: true)
293
+ replace_on_target(record, true, replace: true, inversing: true)
296
294
  end
297
295
  end
298
296
 
@@ -342,7 +340,7 @@ module ActiveRecord
342
340
  end
343
341
  end
344
342
 
345
- persisted + memory
343
+ persisted + memory.reject(&:persisted?)
346
344
  end
347
345
 
348
346
  def _create_record(attributes, raise = false, &block)
@@ -425,7 +423,7 @@ module ActiveRecord
425
423
  common_records = intersection(new_target, original_target)
426
424
  common_records.each do |record|
427
425
  skip_callbacks = true
428
- replace_on_target(record, @target.index(record), skip_callbacks)
426
+ replace_on_target(record, skip_callbacks, replace: true)
429
427
  end
430
428
  end
431
429
 
@@ -448,7 +446,11 @@ module ActiveRecord
448
446
  records
449
447
  end
450
448
 
451
- def replace_on_target(record, index, skip_callbacks)
449
+ def replace_on_target(record, skip_callbacks, replace:, inversing: false)
450
+ if replace && (!record.new_record? || @replaced_or_added_targets.include?(record))
451
+ index = @target.index(record)
452
+ end
453
+
452
454
  catch(:abort) do
453
455
  callback(:before_add, record)
454
456
  end || return unless skip_callbacks
@@ -459,6 +461,12 @@ module ActiveRecord
459
461
 
460
462
  yield(record) if block_given?
461
463
 
464
+ if !index && @replaced_or_added_targets.include?(record)
465
+ index = @target.index(record)
466
+ end
467
+
468
+ @replaced_or_added_targets << record if inversing || index || record.new_record?
469
+
462
470
  if index
463
471
  target[index] = record
464
472
  elsif @_was_loaded || !loaded?
@@ -129,9 +129,7 @@ module ActiveRecord
129
129
  end
130
130
 
131
131
  def reflection_scope
132
- @reflection_scope ||= begin
133
- reflection.join_scopes(klass.arel_table, klass.predicate_builder, klass).inject(&:merge!) || klass.unscoped
134
- end
132
+ @reflection_scope ||= reflection.join_scopes(klass.arel_table, klass.predicate_builder, klass).inject(klass.unscoped, &:merge!)
135
133
  end
136
134
 
137
135
  def build_scope
@@ -45,13 +45,15 @@ module ActiveRecord
45
45
  raise ArgumentError, "Cannot serialize #{object_class}. Classes passed to `serialize` must have a 0 argument constructor."
46
46
  end
47
47
 
48
- if YAML.respond_to?(:unsafe_load)
49
- def yaml_load(payload)
50
- YAML.unsafe_load(payload)
51
- end
52
- else
53
- def yaml_load(payload)
54
- YAML.load(payload)
48
+ def yaml_load(payload)
49
+ if !ActiveRecord::Base.use_yaml_unsafe_load
50
+ YAML.safe_load(payload, permitted_classes: ActiveRecord::Base.yaml_column_permitted_classes, aliases: true)
51
+ else
52
+ if YAML.respond_to?(:unsafe_load)
53
+ YAML.unsafe_load(payload)
54
+ else
55
+ YAML.load(payload)
56
+ end
55
57
  end
56
58
  end
57
59
  end
@@ -1177,7 +1177,7 @@ module ActiveRecord
1177
1177
  return owner_to_pool_manager[owner] if owner_to_pool_manager.key?(owner)
1178
1178
 
1179
1179
  if owner == "primary"
1180
- ActiveSupport::Deprecation.warn("Using `\"primary\"` as a `connection_specification_name` is deprecated and will be removed in Rails 6.2.0. Please use `ActiveRecord::Base`.")
1180
+ ActiveSupport::Deprecation.warn("Using `\"primary\"` as a `connection_specification_name` is deprecated and will be removed in Rails 7.0.0. Please use `ActiveRecord::Base`.")
1181
1181
  owner_to_pool_manager[Base.name]
1182
1182
  end
1183
1183
  end
@@ -12,7 +12,7 @@ module ActiveRecord
12
12
  if value.is_a?(Base)
13
13
  ActiveSupport::Deprecation.warn(<<~MSG)
14
14
  Passing an Active Record object to `quote` directly is deprecated
15
- and will be no longer quoted as id value in Rails 6.2.
15
+ and will be no longer quoted as id value in Rails 7.0.
16
16
  MSG
17
17
  value = value.id_for_database
18
18
  end
@@ -27,14 +27,14 @@ module ActiveRecord
27
27
  if value.is_a?(Base)
28
28
  ActiveSupport::Deprecation.warn(<<~MSG)
29
29
  Passing an Active Record object to `type_cast` directly is deprecated
30
- and will be no longer type casted as id value in Rails 6.2.
30
+ and will be no longer type casted as id value in Rails 7.0.
31
31
  MSG
32
32
  value = value.id_for_database
33
33
  end
34
34
 
35
35
  if column
36
36
  ActiveSupport::Deprecation.warn(<<~MSG)
37
- Passing a column to `type_cast` is deprecated and will be removed in Rails 6.2.
37
+ Passing a column to `type_cast` is deprecated and will be removed in Rails 7.0.
38
38
  MSG
39
39
  type = lookup_cast_type_from_column(column)
40
40
  value = type.serialize(value)
@@ -198,6 +198,10 @@ module ActiveRecord
198
198
 
199
199
  def index_options(table_name)
200
200
  index_options = as_options(index)
201
+
202
+ # legacy reference index names are used on versions 6.0 and earlier
203
+ return index_options if options[:_uses_legacy_reference_index_name]
204
+
201
205
  index_options[:name] ||= polymorphic_index_name(table_name) if polymorphic
202
206
  index_options
203
207
  end
@@ -26,6 +26,8 @@ module ActiveRecord
26
26
 
27
27
  def write_query?(sql) # :nodoc:
28
28
  !READ_QUERY.match?(sql)
29
+ rescue ArgumentError # Invalid encoding
30
+ !READ_QUERY.match?(sql.b)
29
31
  end
30
32
 
31
33
  def explain(arel, binds = [])
@@ -167,6 +167,9 @@ module ActiveRecord
167
167
  elsif type_metadata.extra == "DEFAULT_GENERATED"
168
168
  default = +"(#{default})" unless default.start_with?("(")
169
169
  default, default_function = nil, default
170
+ elsif type_metadata.type == :text && default
171
+ # strip and unescape quotes
172
+ default = default[1...-1].gsub("\\'", "'")
170
173
  end
171
174
 
172
175
  MySQL::Column.new(
@@ -203,7 +206,7 @@ module ActiveRecord
203
206
  def data_source_sql(name = nil, type: nil)
204
207
  scope = quoted_scope(name, type: type)
205
208
 
206
- sql = +"SELECT table_name FROM (SELECT * FROM information_schema.tables "
209
+ sql = +"SELECT table_name FROM (SELECT table_name, table_type FROM information_schema.tables "
207
210
  sql << " WHERE table_schema = #{scope[:schema]}) _subquery"
208
211
  if scope[:type] || scope[:name]
209
212
  conditions = []
@@ -28,6 +28,8 @@ module ActiveRecord
28
28
 
29
29
  def write_query?(sql) # :nodoc:
30
30
  !READ_QUERY.match?(sql)
31
+ rescue ArgumentError # Invalid encoding
32
+ !READ_QUERY.match?(sql.b)
31
33
  end
32
34
 
33
35
  # Executes an SQL statement, returning a PG::Result object on success
@@ -198,16 +198,40 @@ module ActiveRecord
198
198
  @indexes = deep_deduplicate(@indexes)
199
199
  end
200
200
 
201
- def deep_deduplicate(value)
202
- case value
203
- when Hash
204
- value.transform_keys { |k| deep_deduplicate(k) }.transform_values { |v| deep_deduplicate(v) }
205
- when Array
206
- value.map { |i| deep_deduplicate(i) }
207
- when String, Deduplicable
208
- -value
209
- else
210
- value
201
+ if RUBY_VERSION < "2.7"
202
+ def deep_deduplicate(value)
203
+ case value
204
+ when Hash
205
+ value.transform_keys { |k| deep_deduplicate(k) }.transform_values { |v| deep_deduplicate(v) }
206
+ when Array
207
+ value.map { |i| deep_deduplicate(i) }
208
+ when String
209
+ if value.tainted?
210
+ # Ruby 2.6 and 2.7 have slightly different implementations of the String#-@ method.
211
+ # In Ruby 2.6, the receiver of the String#-@ method is modified under certain
212
+ # circumstances, and this was later identified as a bug
213
+ # (https://bugs.ruby-lang.org/issues/15926) and only fixed in Ruby 2.7.
214
+ value = value.dup
215
+ end
216
+ -value
217
+ when Deduplicable
218
+ -value
219
+ else
220
+ value
221
+ end
222
+ end
223
+ else
224
+ def deep_deduplicate(value)
225
+ case value
226
+ when Hash
227
+ value.transform_keys { |k| deep_deduplicate(k) }.transform_values { |v| deep_deduplicate(v) }
228
+ when Array
229
+ value.map { |i| deep_deduplicate(i) }
230
+ when String, Deduplicable
231
+ -value
232
+ else
233
+ value
234
+ end
211
235
  end
212
236
  end
213
237
 
@@ -11,6 +11,8 @@ module ActiveRecord
11
11
 
12
12
  def write_query?(sql) # :nodoc:
13
13
  !READ_QUERY.match?(sql)
14
+ rescue ArgumentError # Invalid encoding
15
+ !READ_QUERY.match?(sql.b)
14
16
  end
15
17
 
16
18
  def explain(arel, binds = [])
@@ -135,7 +135,7 @@ module ActiveRecord
135
135
  # Dog.first # finds first Dog record stored on the shard one replica
136
136
  # end
137
137
  #
138
- # The database kwarg is deprecated and will be removed in 6.2.0 without replacement.
138
+ # The database kwarg is deprecated and will be removed in Rails 7.0.0 without replacement.
139
139
  def connected_to(database: nil, role: nil, shard: nil, prevent_writes: false, &blk)
140
140
  if legacy_connection_handling
141
141
  if self != Base
@@ -154,7 +154,7 @@ module ActiveRecord
154
154
  if database && (role || shard)
155
155
  raise ArgumentError, "`connected_to` cannot accept a `database` argument with any other arguments."
156
156
  elsif database
157
- ActiveSupport::Deprecation.warn("The database key in `connected_to` is deprecated. It will be removed in Rails 6.2.0 without replacement.")
157
+ ActiveSupport::Deprecation.warn("The database key in `connected_to` is deprecated. It will be removed in Rails 7.0.0 without replacement.")
158
158
 
159
159
  if database.is_a?(Hash)
160
160
  role, database = database.first
@@ -155,6 +155,14 @@ module ActiveRecord
155
155
 
156
156
  mattr_accessor :legacy_connection_handling, instance_writer: false, default: true
157
157
 
158
+ # Application configurable boolean that instructs the YAML Coder to use
159
+ # an unsafe load if set to true.
160
+ mattr_accessor :use_yaml_unsafe_load, instance_writer: false, default: false
161
+
162
+ # Application configurable array that provides additional permitted classes
163
+ # to Psych safe_load in the YAML Coder
164
+ mattr_accessor :yaml_column_permitted_classes, instance_writer: false, default: []
165
+
158
166
  self.filter_attributes = []
159
167
 
160
168
  def self.connection_handler
@@ -278,11 +286,11 @@ module ActiveRecord
278
286
  end
279
287
 
280
288
  def self.allow_unsafe_raw_sql # :nodoc:
281
- ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql is deprecated and will be removed in Rails 6.2")
289
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql is deprecated and will be removed in Rails 7.0")
282
290
  end
283
291
 
284
292
  def self.allow_unsafe_raw_sql=(value) # :nodoc:
285
- ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql= is deprecated and will be removed in Rails 6.2")
293
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql= is deprecated and will be removed in Rails 7.0")
286
294
  end
287
295
 
288
296
  self.default_connection_handler = ConnectionAdapters::ConnectionHandler.new
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "uri"
3
4
  require "active_support/core_ext/enumerable"
4
5
 
5
6
  module ActiveRecord
@@ -32,7 +32,7 @@ module ActiveRecord
32
32
  end
33
33
 
34
34
  def config
35
- ActiveSupport::Deprecation.warn("DatabaseConfig#config will be removed in 6.2.0 in favor of DatabaseConfigurations#configuration_hash which returns a hash with symbol keys")
35
+ ActiveSupport::Deprecation.warn("DatabaseConfig#config will be removed in 7.0.0 in favor of DatabaseConfig#configuration_hash which returns a hash with symbol keys")
36
36
  configuration_hash.stringify_keys
37
37
  end
38
38
 
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "uri"
3
4
  require "active_record/database_configurations/database_config"
4
5
  require "active_record/database_configurations/hash_config"
5
6
  require "active_record/database_configurations/url_config"
@@ -40,7 +41,7 @@ module ActiveRecord
40
41
  def configs_for(env_name: nil, spec_name: nil, name: nil, include_replicas: false)
41
42
  if spec_name
42
43
  name = spec_name
43
- ActiveSupport::Deprecation.warn("The kwarg `spec_name` is deprecated in favor of `name`. `spec_name` will be removed in Rails 6.2")
44
+ ActiveSupport::Deprecation.warn("The kwarg `spec_name` is deprecated in favor of `name`. `spec_name` will be removed in Rails 7.0")
44
45
  end
45
46
 
46
47
  env_name ||= default_env if name
@@ -9,8 +9,8 @@ module ActiveRecord
9
9
  module VERSION
10
10
  MAJOR = 6
11
11
  MINOR = 1
12
- TINY = 4
13
- PRE = "6"
12
+ TINY = 6
13
+ PRE = "1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -10,6 +10,8 @@ module ActiveRecord
10
10
  # This is enabled by default. To disable this functionality set
11
11
  # `use_metadata_table` to false in your database configuration.
12
12
  class InternalMetadata < ActiveRecord::Base # :nodoc:
13
+ self.record_timestamps = true
14
+
13
15
  class << self
14
16
  def enabled?
15
17
  ActiveRecord::Base.connection.use_metadata_table?
@@ -10,7 +10,7 @@ module ActiveRecord
10
10
  else
11
11
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
12
12
  YAML loading from legacy format older than Rails 5.0 is deprecated
13
- and will be removed in Rails 6.2.
13
+ and will be removed in Rails 7.0.
14
14
  MSG
15
15
  if coder["attributes"].is_a?(ActiveModel::AttributeSet)
16
16
  Rails420.convert(klass, coder)
@@ -24,9 +24,8 @@ module ActiveRecord
24
24
 
25
25
  module TableDefinition
26
26
  def references(*args, **options)
27
- args.each do |ref_name|
28
- ReferenceDefinition.new(ref_name, **options).add_to(self)
29
- end
27
+ options[:_uses_legacy_reference_index_name] = true
28
+ super
30
29
  end
31
30
  alias :belongs_to :references
32
31
  end
@@ -56,8 +55,12 @@ module ActiveRecord
56
55
  end
57
56
 
58
57
  def add_reference(table_name, ref_name, **options)
59
- ReferenceDefinition.new(ref_name, **options)
60
- .add_to(connection.update_table_definition(table_name, self))
58
+ if connection.adapter_name == "SQLite"
59
+ options[:type] = :integer
60
+ end
61
+
62
+ options[:_uses_legacy_reference_index_name] = true
63
+ super
61
64
  end
62
65
  alias :add_belongs_to :add_reference
63
66
 
@@ -126,7 +129,7 @@ module ActiveRecord
126
129
  class << t
127
130
  prepend TableDefinition
128
131
  end
129
- t
132
+ super
130
133
  end
131
134
 
132
135
  def command_recorder
@@ -630,7 +630,7 @@ module ActiveRecord
630
630
  if column.sql_type.start_with?("interval")
631
631
  precision_arguments = column.precision.presence && ", precision: #{column.precision}"
632
632
  ActiveSupport::Deprecation.warn(<<~WARNING)
633
- The behavior of the `:interval` type will be changing in Rails 6.2
633
+ The behavior of the `:interval` type will be changing in Rails 7.0
634
634
  to return an `ActiveSupport::Duration` object. If you'd like to keep
635
635
  the old behavior, you can add this line to #{self.name} model:
636
636
 
@@ -279,5 +279,23 @@ To keep using the current cache store, you can turn off cache versioning entirel
279
279
  self.signed_id_verifier_secret ||= -> { Rails.application.key_generator.generate_key("active_record/signed_id") }
280
280
  end
281
281
  end
282
+
283
+ initializer "active_record.use_yaml_unsafe_load" do |app|
284
+ config.after_initialize do
285
+ unless app.config.active_record.use_yaml_unsafe_load.nil?
286
+ ActiveRecord::Base.use_yaml_unsafe_load =
287
+ app.config.active_record.use_yaml_unsafe_load
288
+ end
289
+ end
290
+ end
291
+
292
+ initializer "active_record.yaml_column_permitted_classes" do |app|
293
+ config.after_initialize do
294
+ unless app.config.active_record.yaml_column_permitted_classes.nil?
295
+ ActiveRecord::Base.yaml_column_permitted_classes =
296
+ app.config.active_record.yaml_column_permitted_classes
297
+ end
298
+ end
299
+ end
282
300
  end
283
301
  end
@@ -464,7 +464,7 @@ db_namespace = namespace :db do
464
464
 
465
465
  task load_if_ruby: ["db:create", :environment] do
466
466
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
467
- Using `bin/rails db:schema:load_if_ruby` is deprecated and will be removed in Rails 6.2.
467
+ Using `bin/rails db:schema:load_if_ruby` is deprecated and will be removed in Rails 7.0.
468
468
  Configure the format using `config.active_record.schema_format = :ruby` to use `schema.rb` and run `bin/rails db:schema:load` instead.
469
469
  MSG
470
470
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
@@ -527,7 +527,7 @@ db_namespace = namespace :db do
527
527
  desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
528
528
  task dump: :load_config do
529
529
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
530
- Using `bin/rails db:structure:dump` is deprecated and will be removed in Rails 6.2.
530
+ Using `bin/rails db:structure:dump` is deprecated and will be removed in Rails 7.0.
531
531
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump` instead.
532
532
  MSG
533
533
 
@@ -538,7 +538,7 @@ db_namespace = namespace :db do
538
538
  desc "Recreates the databases from the structure.sql file"
539
539
  task load: [:load_config, :check_protected_environments] do
540
540
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
541
- Using `bin/rails db:structure:load` is deprecated and will be removed in Rails 6.2.
541
+ Using `bin/rails db:structure:load` is deprecated and will be removed in Rails 7.0.
542
542
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
543
543
  MSG
544
544
  db_namespace["schema:load"].invoke
@@ -546,7 +546,7 @@ db_namespace = namespace :db do
546
546
 
547
547
  task load_if_sql: ["db:create", :environment] do
548
548
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
549
- Using `bin/rails db:structure:load_if_sql` is deprecated and will be removed in Rails 6.2.
549
+ Using `bin/rails db:structure:load_if_sql` is deprecated and will be removed in Rails 7.0.
550
550
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
551
551
  MSG
552
552
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :sql
@@ -557,7 +557,7 @@ db_namespace = namespace :db do
557
557
  desc "Dumps the #{name} database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
558
558
  task name => :load_config do
559
559
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
560
- Using `bin/rails db:structure:dump:#{name}` is deprecated and will be removed in Rails 6.2.
560
+ Using `bin/rails db:structure:dump:#{name}` is deprecated and will be removed in Rails 7.0.
561
561
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump:#{name}` instead.
562
562
  MSG
563
563
  db_namespace["schema:dump:#{name}"].invoke
@@ -571,7 +571,7 @@ db_namespace = namespace :db do
571
571
  desc "Recreates the #{name} database from the structure.sql file"
572
572
  task name => :load_config do
573
573
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
574
- Using `bin/rails db:structure:load:#{name}` is deprecated and will be removed in Rails 6.2.
574
+ Using `bin/rails db:structure:load:#{name}` is deprecated and will be removed in Rails 7.0.
575
575
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load:#{name}` instead.
576
576
  MSG
577
577
  db_namespace["schema:load:#{name}"].invoke
@@ -603,7 +603,7 @@ db_namespace = namespace :db do
603
603
  # desc "Recreate the test database from an existent structure.sql file"
604
604
  task load_structure: %w(db:test:purge) do
605
605
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
606
- Using `bin/rails db:test:load_structure` is deprecated and will be removed in Rails 6.2.
606
+ Using `bin/rails db:test:load_structure` is deprecated and will be removed in Rails 7.0.
607
607
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_schema` instead.
608
608
  MSG
609
609
  db_namespace["test:load_schema"].invoke
@@ -650,7 +650,7 @@ db_namespace = namespace :db do
650
650
  namespace :load_structure do
651
651
  task name => "db:test:purge:#{name}" do
652
652
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
653
- Using `bin/rails db:test:load_structure:#{name}` is deprecated and will be removed in Rails 6.2.
653
+ Using `bin/rails db:test:load_structure:#{name}` is deprecated and will be removed in Rails 7.0.
654
654
  Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_structure:#{name}` instead.
655
655
  MSG
656
656
  db_namespace["test:load_schema:#{name}"].invoke
@@ -321,8 +321,8 @@ module ActiveRecord
321
321
 
322
322
  unless group_fields == group_values
323
323
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
324
- `#{operation}` with group by duplicated fields does no longer affect to result in Rails 6.2.
325
- To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields
324
+ `#{operation}` with group by duplicated fields does no longer affect to result in Rails 7.0.
325
+ To migrate to Rails 7.0's behavior, use `uniq!(:group)` to deduplicate group fields
326
326
  (`#{klass.name&.tableize || klass.table_name}.uniq!(:group).#{operation}(#{column_name.inspect})`).
327
327
  MSG
328
328
  group_fields = group_values
@@ -369,7 +369,7 @@ module ActiveRecord
369
369
  blank_value = order_values.first
370
370
  ActiveSupport::Deprecation.warn(<<~MSG.squish)
371
371
  `.reorder(#{blank_value.inspect})` with `.first` / `.first!` no longer
372
- takes non-deterministic result in Rails 6.2.
372
+ takes non-deterministic result in Rails 7.0.
373
373
  To continue taking non-deterministic result, use `.take` / `.take!` instead.
374
374
  MSG
375
375
  end
@@ -1157,8 +1157,8 @@ module ActiveRecord
1157
1157
  annotates = annotates.uniq if annotates.size > 1
1158
1158
  unless annotates == annotate_values
1159
1159
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
1160
- Duplicated query annotations are no longer shown in queries in Rails 6.2.
1161
- To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations
1160
+ Duplicated query annotations are no longer shown in queries in Rails 7.0.
1161
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations
1162
1162
  (`#{klass.name&.tableize || klass.table_name}.uniq!(:annotate)`).
1163
1163
  MSG
1164
1164
  annotates = annotate_values
@@ -168,8 +168,8 @@ module ActiveRecord
168
168
  else
169
169
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
170
170
  Merging (#{node.to_sql}) and (#{ref.to_sql}) no longer maintain
171
- both conditions, and will be replaced by the latter in Rails 6.2.
172
- To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
171
+ both conditions, and will be replaced by the latter in Rails 7.0.
172
+ To migrate to Rails 7.0's behavior, use `relation.merge(other, rewhere: true)`.
173
173
  MSG
174
174
  false
175
175
  end
@@ -340,7 +340,7 @@ module ActiveRecord
340
340
  db_config = resolve_configuration(configuration)
341
341
 
342
342
  if environment || name
343
- ActiveSupport::Deprecation.warn("`environment` and `name` will be removed as parameters in 6.2.0, you may now pass an ActiveRecord::DatabaseConfigurations::DatabaseConfig as `configuration` instead.")
343
+ ActiveSupport::Deprecation.warn("`environment` and `name` will be removed as parameters in 7.0.0, you may now pass an ActiveRecord::DatabaseConfigurations::DatabaseConfig as `configuration` instead.")
344
344
  end
345
345
 
346
346
  name ||= db_config.name
data/lib/active_record.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2004-2020 David Heinemeier Hansson
4
+ # Copyright (c) 2004-2022 David Heinemeier Hansson
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.4.6
4
+ version: 6.1.6.1
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: 2022-02-11 00:00:00.000000000 Z
11
+ date: 2022-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 6.1.4.6
19
+ version: 6.1.6.1
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: 6.1.4.6
26
+ version: 6.1.6.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activemodel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 6.1.4.6
33
+ version: 6.1.6.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 6.1.4.6
40
+ version: 6.1.6.1
41
41
  description: Databases on Rails. Build a persistent domain model by mapping database
42
42
  tables to Ruby classes. Strong conventions for associations, validations, aggregations,
43
43
  migrations, and testing come baked-in.
@@ -390,10 +390,11 @@ licenses:
390
390
  - MIT
391
391
  metadata:
392
392
  bug_tracker_uri: https://github.com/rails/rails/issues
393
- changelog_uri: https://github.com/rails/rails/blob/v6.1.4.6/activerecord/CHANGELOG.md
394
- documentation_uri: https://api.rubyonrails.org/v6.1.4.6/
393
+ changelog_uri: https://github.com/rails/rails/blob/v6.1.6.1/activerecord/CHANGELOG.md
394
+ documentation_uri: https://api.rubyonrails.org/v6.1.6.1/
395
395
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
396
- source_code_uri: https://github.com/rails/rails/tree/v6.1.4.6/activerecord
396
+ source_code_uri: https://github.com/rails/rails/tree/v6.1.6.1/activerecord
397
+ rubygems_mfa_required: 'true'
397
398
  post_install_message:
398
399
  rdoc_options:
399
400
  - "--main"
@@ -411,7 +412,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
411
412
  - !ruby/object:Gem::Version
412
413
  version: '0'
413
414
  requirements: []
414
- rubygems_version: 3.2.22
415
+ rubygems_version: 3.3.3
415
416
  signing_key:
416
417
  specification_version: 4
417
418
  summary: Object-relational mapper framework (part of Rails).