activerecord 6.1.4.7 → 6.1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +183 -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 +14 -2
  7. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +1 -1
  8. data/lib/active_record/connection_adapters/abstract/quoting.rb +13 -4
  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/postgresql/quoting.rb +26 -0
  14. data/lib/active_record/connection_adapters/postgresql_adapter.rb +2 -2
  15. data/lib/active_record/connection_adapters/schema_cache.rb +34 -10
  16. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +2 -0
  17. data/lib/active_record/connection_handling.rb +2 -2
  18. data/lib/active_record/core.rb +17 -2
  19. data/lib/active_record/database_configurations/connection_url_resolver.rb +1 -0
  20. data/lib/active_record/database_configurations/hash_config.rb +1 -1
  21. data/lib/active_record/database_configurations.rb +2 -1
  22. data/lib/active_record/gem_version.rb +2 -2
  23. data/lib/active_record/internal_metadata.rb +2 -0
  24. data/lib/active_record/legacy_yaml_adapter.rb +1 -1
  25. data/lib/active_record/migration/compatibility.rb +9 -6
  26. data/lib/active_record/model_schema.rb +1 -1
  27. data/lib/active_record/railties/databases.rake +8 -8
  28. data/lib/active_record/relation/calculations.rb +2 -2
  29. data/lib/active_record/relation/finder_methods.rb +1 -1
  30. data/lib/active_record/relation/query_methods.rb +4 -2
  31. data/lib/active_record/relation/where_clause.rb +2 -2
  32. data/lib/active_record/store.rb +6 -1
  33. data/lib/active_record/tasks/database_tasks.rb +1 -1
  34. data/lib/active_record/test_fixtures.rb +9 -5
  35. data/lib/active_record.rb +1 -1
  36. metadata +11 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f94e41ee3dad511c9bd2fd67fa6527edc7097afc47ed29c8dfcf35f85d30b93
4
- data.tar.gz: 60b172857703fad8ec944dc0c7015935caae5b3f794eccf9658693270883af6d
3
+ metadata.gz: c9b76baff5a3e39a0efb5a3780007e80b4da0ab9518c2707d120d035dc8c77ec
4
+ data.tar.gz: b4bf736f8d49fe9f3f65c6c0a763b138fdbcafbc0ab808e2bb9bd16c9bca6620
5
5
  SHA512:
6
- metadata.gz: 631129932dee2df2645c38ee17a8b6d5064b45ef0acb48d73cce6a2d66f8e233c5c351ef10ba398dcc712d7ec6570d15bf57a552fd66967c41e748b6c22782ea
7
- data.tar.gz: b79336dec7a85e5a52d2ad93e620081bd81e548b9730a1ffa2b543c4f67c6b7079410cac808c98a18271a3ac0fa510d8ce4df6b14b010da13bdcf370fef0e494
6
+ metadata.gz: 8a3961a9e8a96f9333e08cce6f4e1b3747e6d58e60a60353a1ab0f5512423c5b64c6796bf782f98f3080e5558f26a9875d5bf0f3a4f2ecb36edbb86d4fe2abb1
7
+ data.tar.gz: 3cf8d6bde005afc71b62ebb545457896b899cf2f2a0d78512e3f1134fe0226e58579e3e3b80a19c3130ea8a5a53dfb98c5b3273ee0c38e28c34c4f474d672aa5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,174 @@
1
+ ## Rails 6.1.7.1 (January 17, 2023) ##
2
+
3
+ * Make sanitize_as_sql_comment more strict
4
+
5
+ Though this method was likely never meant to take user input, it was
6
+ attempting sanitization. That sanitization could be bypassed with
7
+ carefully crafted input.
8
+
9
+ This commit makes the sanitization more robust by replacing any
10
+ occurrances of "/*" or "*/" with "/ *" or "* /". It also performs a
11
+ first pass to remove one surrounding comment to avoid compatibility
12
+ issues for users relying on the existing removal.
13
+
14
+ This also clarifies in the documentation of annotate that it should not
15
+ be provided user input.
16
+
17
+ [CVE-2023-22794]
18
+
19
+ * Added integer width check to PostgreSQL::Quoting
20
+
21
+ Given a value outside the range for a 64bit signed integer type
22
+ PostgreSQL will treat the column type as numeric. Comparing
23
+ integer values against numeric values can result in a slow
24
+ sequential scan.
25
+
26
+ This behavior is configurable via
27
+ ActiveRecord::Base.raise_int_wider_than_64bit which defaults to true.
28
+
29
+ [CVE-2022-44566]
30
+
31
+ ## Rails 6.1.7 (September 09, 2022) ##
32
+
33
+ * Symbol is allowed by default for YAML columns
34
+
35
+ *Étienne Barrié*
36
+
37
+ * Fix `ActiveRecord::Store` to serialize as a regular Hash
38
+
39
+ Previously it would serialize as an `ActiveSupport::HashWithIndifferentAccess`
40
+ which is wasteful and cause problem with YAML safe_load.
41
+
42
+ *Jean Boussier*
43
+
44
+ * Fix PG.connect keyword arguments deprecation warning on ruby 2.7
45
+
46
+ Fixes #44307.
47
+
48
+ *Nikita Vasilevsky*
49
+
50
+ ## Rails 6.1.6.1 (July 12, 2022) ##
51
+
52
+ * Change ActiveRecord::Coders::YAMLColumn default to safe_load
53
+
54
+ This adds two new configuration options The configuration options are as
55
+ follows:
56
+
57
+ * `config.active_storage.use_yaml_unsafe_load`
58
+
59
+ When set to true, this configuration option tells Rails to use the old
60
+ "unsafe" YAML loading strategy, maintaining the existing behavior but leaving
61
+ the possible escalation vulnerability in place. Setting this option to true
62
+ is *not* recommended, but can aid in upgrading.
63
+
64
+ * `config.active_record.yaml_column_permitted_classes`
65
+
66
+ The "safe YAML" loading method does not allow all classes to be deserialized
67
+ by default. This option allows you to specify classes deemed "safe" in your
68
+ application. For example, if your application uses Symbol and Time in
69
+ serialized data, you can add Symbol and Time to the allowed list as follows:
70
+
71
+ ```
72
+ config.active_record.yaml_column_permitted_classes = [Symbol, Date, Time]
73
+ ```
74
+
75
+ [CVE-2022-32224]
76
+
77
+
78
+ ## Rails 6.1.6 (May 09, 2022) ##
79
+
80
+ * No changes.
81
+
82
+
83
+ ## Rails 6.1.5.1 (April 26, 2022) ##
84
+
85
+ * No changes.
86
+
87
+
88
+ ## Rails 6.1.5 (March 09, 2022) ##
89
+
90
+ * Fix `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` for Ruby 2.6.
91
+
92
+ Ruby 2.6 and 2.7 have slightly different implementations of the `String#-@` method.
93
+ In Ruby 2.6, the receiver of the `String#-@` method is modified under certain circumstances.
94
+ This was later identified as a bug (https://bugs.ruby-lang.org/issues/15926) and only
95
+ fixed in Ruby 2.7.
96
+
97
+ Before the changes in this commit, the
98
+ `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` method, which internally
99
+ calls the `String#-@` method, could also modify an input string argument in Ruby 2.6 --
100
+ changing a tainted, unfrozen string into a tainted, frozen string.
101
+
102
+ Fixes #43056
103
+
104
+ *Eric O'Hanlon*
105
+
106
+ * Fix migration compatibility to create SQLite references/belongs_to column as integer when
107
+ migration version is 6.0.
108
+
109
+ `reference`/`belongs_to` in migrations with version 6.0 were creating columns as
110
+ bigint instead of integer for the SQLite Adapter.
111
+
112
+ *Marcelo Lauxen*
113
+
114
+ * Fix dbconsole for 3-tier config.
115
+
116
+ *Eileen M. Uchitelle*
117
+
118
+ * Better handle SQL queries with invalid encoding.
119
+
120
+ ```ruby
121
+ Post.create(name: "broken \xC8 UTF-8")
122
+ ```
123
+
124
+ Would cause all adapters to fail in a non controlled way in the code
125
+ responsible to detect write queries.
126
+
127
+ The query is now properly passed to the database connection, which might or might
128
+ not be able to handle it, but will either succeed or failed in a more correct way.
129
+
130
+ *Jean Boussier*
131
+
132
+ * Ignore persisted in-memory records when merging target lists.
133
+
134
+ *Kevin Sjöberg*
135
+
136
+ * Fix regression bug that caused ignoring additional conditions for preloading
137
+ `has_many` through relations.
138
+
139
+ Fixes #43132
140
+
141
+ *Alexander Pauly*
142
+
143
+ * Fix `ActiveRecord::InternalMetadata` to not be broken by
144
+ `config.active_record.record_timestamps = false`
145
+
146
+ Since the model always create the timestamp columns, it has to set them, otherwise it breaks
147
+ various DB management tasks.
148
+
149
+ Fixes #42983
150
+
151
+ *Jean Boussier*
152
+
153
+ * Fix duplicate active record objects on `inverse_of`.
154
+
155
+ *Justin Carvalho*
156
+
157
+ * Fix duplicate objects stored in has many association after save.
158
+
159
+ Fixes #42549.
160
+
161
+ *Alex Ghiculescu*
162
+
163
+ * Fix performance regression in `CollectionAssocation#build`.
164
+
165
+ *Alex Ghiculescu*
166
+
167
+ * Fix retrieving default value for text column for MariaDB.
168
+
169
+ *fatkodima*
170
+
171
+
1
172
  ## Rails 6.1.4.7 (March 08, 2022) ##
2
173
 
3
174
  * No changes.
@@ -102,10 +273,10 @@
102
273
  ```
103
274
 
104
275
  In the example, `dog.treats` would still raise even though
105
- `strict_loading` was set to false. This is a bug effecting more than
106
- Active Storage which is why I made this PR superceeding #41461. We need
276
+ `strict_loading` was set to false. This is a bug affecting more than
277
+ Active Storage which is why I made this PR superseding #41461. We need
107
278
  to fix this for all applications since the behavior is a little
108
- surprising. I took the test from ##41461 and the code suggestion from #41453
279
+ surprising. I took the test from #41461 and the code suggestion from #41453
109
280
  with some additions.
110
281
 
111
282
  *Eileen M. Uchitelle*, *Radamés Roriz*
@@ -607,7 +778,7 @@
607
778
 
608
779
  attribute :duration, :interval
609
780
 
610
- To keep old behavior until 6.2 is released:
781
+ To keep old behavior until 7.0 is released:
611
782
 
612
783
  attribute :duration, :string
613
784
 
@@ -779,8 +950,8 @@
779
950
  *Ryuta Kamizono*
780
951
 
781
952
  * Merging conditions on the same column no longer maintain both conditions,
782
- and will be consistently replaced by the latter condition in Rails 6.2.
783
- To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
953
+ and will be consistently replaced by the latter condition in Rails 7.0.
954
+ To migrate to Rails 7.0's behavior, use `relation.merge(other, rewhere: true)`.
784
955
 
785
956
  ```ruby
786
957
  # Rails 6.1 (IN clause is replaced by merger side equality condition)
@@ -789,10 +960,10 @@
789
960
  # Rails 6.1 (both conflict conditions exists, deprecated)
790
961
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
791
962
 
792
- # Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
963
+ # Rails 6.1 with rewhere to migrate to Rails 7.0's behavior
793
964
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
794
965
 
795
- # Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
966
+ # Rails 7.0 (same behavior with IN clause, mergee side condition is consistently replaced)
796
967
  Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
797
968
  Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
798
969
  ```
@@ -884,7 +1055,7 @@
884
1055
 
885
1056
  * Deprecate aggregations with group by duplicated fields.
886
1057
 
887
- To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
1058
+ To migrate to Rails 7.0's behavior, use `uniq!(:group)` to deduplicate group fields.
888
1059
 
889
1060
  ```ruby
890
1061
  accounts = Account.group(:firm_id)
@@ -908,7 +1079,7 @@
908
1079
 
909
1080
  * Deprecate duplicated query annotations.
910
1081
 
911
- To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
1082
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
912
1083
 
913
1084
  ```ruby
914
1085
  accounts = Account.where(id: [1, 2]).annotate("david and mary")
@@ -1329,13 +1500,13 @@
1329
1500
 
1330
1501
  * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
1331
1502
 
1332
- `#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.
1503
+ `#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.
1333
1504
 
1334
1505
  *Eileen M. Uchitelle*, *John Crepezzi*
1335
1506
 
1336
1507
  * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
1337
1508
 
1338
- Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
1509
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in Rails 7.0.
1339
1510
 
1340
1511
  *Eileen M. Uchitelle*, *John Crepezzi*
1341
1512
 
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
@@ -47,11 +47,23 @@ module ActiveRecord
47
47
 
48
48
  if YAML.respond_to?(:unsafe_load)
49
49
  def yaml_load(payload)
50
- YAML.unsafe_load(payload)
50
+ if ActiveRecord::Base.use_yaml_unsafe_load
51
+ YAML.unsafe_load(payload)
52
+ elsif YAML.method(:safe_load).parameters.include?([:key, :permitted_classes])
53
+ YAML.safe_load(payload, permitted_classes: ActiveRecord::Base.yaml_column_permitted_classes, aliases: true)
54
+ else
55
+ YAML.safe_load(payload, ActiveRecord::Base.yaml_column_permitted_classes, [], true)
56
+ end
51
57
  end
52
58
  else
53
59
  def yaml_load(payload)
54
- YAML.load(payload)
60
+ if ActiveRecord::Base.use_yaml_unsafe_load
61
+ YAML.load(payload)
62
+ elsif YAML.method(:safe_load).parameters.include?([:key, :permitted_classes])
63
+ YAML.safe_load(payload, permitted_classes: ActiveRecord::Base.yaml_column_permitted_classes, aliases: true)
64
+ else
65
+ YAML.safe_load(payload, ActiveRecord::Base.yaml_column_permitted_classes, [], true)
66
+ end
55
67
  end
56
68
  end
57
69
  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)
@@ -138,7 +138,16 @@ module ActiveRecord
138
138
  end
139
139
 
140
140
  def sanitize_as_sql_comment(value) # :nodoc:
141
- value.to_s.gsub(%r{ (/ (?: | \g<1>) \*) \+? \s* | \s* (\* (?: | \g<2>) /) }x, "")
141
+ # Sanitize a string to appear within a SQL comment
142
+ # For compatibility, this also surrounding "/*+", "/*", and "*/"
143
+ # charcacters, possibly with single surrounding space.
144
+ # Then follows that by replacing any internal "*/" or "/ *" with
145
+ # "* /" or "/ *"
146
+ comment = value.to_s.dup
147
+ comment.gsub!(%r{\A\s*/\*\+?\s?|\s?\*/\s*\Z}, "")
148
+ comment.gsub!("*/", "* /")
149
+ comment.gsub!("/*", "/ *")
150
+ comment
142
151
  end
143
152
 
144
153
  def column_name_matcher # :nodoc:
@@ -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
@@ -4,6 +4,12 @@ module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  module PostgreSQL
6
6
  module Quoting
7
+ class IntegerOutOf64BitRange < StandardError
8
+ def initialize(msg)
9
+ super(msg)
10
+ end
11
+ end
12
+
7
13
  # Escapes binary strings for bytea input to the database.
8
14
  def escape_bytea(value)
9
15
  @connection.escape_bytea(value) if value
@@ -120,7 +126,27 @@ module ActiveRecord
120
126
  super(query_value("SELECT #{quote(sql_type)}::regtype::oid", "SCHEMA").to_i)
121
127
  end
122
128
 
129
+ def check_int_in_range(value)
130
+ if value.to_int > 9223372036854775807 || value.to_int < -9223372036854775808
131
+ exception = <<~ERROR
132
+ Provided value outside of the range of a signed 64bit integer.
133
+
134
+ PostgreSQL will treat the column type in question as a numeric.
135
+ This may result in a slow sequential scan due to a comparison
136
+ being performed between an integer or bigint value and a numeric value.
137
+
138
+ To allow for this potentially unwanted behavior, set
139
+ ActiveRecord::Base.raise_int_wider_than_64bit to false.
140
+ ERROR
141
+ raise IntegerOutOf64BitRange.new exception
142
+ end
143
+ end
144
+
123
145
  def _quote(value)
146
+ if ActiveRecord::Base.raise_int_wider_than_64bit && value.is_a?(Integer)
147
+ check_int_in_range(value)
148
+ end
149
+
124
150
  case value
125
151
  when OID::Xml::Data
126
152
  "xml '#{quote_string(value.to_s)}'"
@@ -75,7 +75,7 @@ module ActiveRecord
75
75
 
76
76
  class << self
77
77
  def new_client(conn_params)
78
- PG.connect(conn_params)
78
+ PG.connect(**conn_params)
79
79
  rescue ::PG::Error => error
80
80
  if conn_params && conn_params[:dbname] && error.message.include?(conn_params[:dbname])
81
81
  raise ActiveRecord::NoDatabaseError
@@ -247,7 +247,7 @@ module ActiveRecord
247
247
  def initialize(connection, logger, connection_parameters, config)
248
248
  super(connection, logger, config)
249
249
 
250
- @connection_parameters = connection_parameters
250
+ @connection_parameters = connection_parameters || {}
251
251
 
252
252
  # @local_tz is initialized as nil to avoid warnings when connect tries to use it
253
253
  @local_tz = nil
@@ -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,21 @@ 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: [Symbol]
165
+
166
+ ##
167
+ # :singleton-method:
168
+ # Application configurable boolean that denotes whether or not to raise
169
+ # an exception when the PostgreSQLAdapter is provided with an integer that is
170
+ # wider than signed 64bit representation
171
+ mattr_accessor :raise_int_wider_than_64bit, instance_writer: false, default: true
172
+
158
173
  self.filter_attributes = []
159
174
 
160
175
  def self.connection_handler
@@ -278,11 +293,11 @@ module ActiveRecord
278
293
  end
279
294
 
280
295
  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")
296
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql is deprecated and will be removed in Rails 7.0")
282
297
  end
283
298
 
284
299
  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")
300
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql= is deprecated and will be removed in Rails 7.0")
286
301
  end
287
302
 
288
303
  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 = "7"
12
+ TINY = 7
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
 
@@ -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
@@ -1035,6 +1035,8 @@ module ActiveRecord
1035
1035
  # # SELECT "users"."name" FROM "users" /* selecting */ /* user */ /* names */
1036
1036
  #
1037
1037
  # The SQL block comment delimiters, "/*" and "*/", will be added automatically.
1038
+ #
1039
+ # Some escaping is performed, however untrusted user input should not be used.
1038
1040
  def annotate(*args)
1039
1041
  check_if_method_has_arguments!(:annotate, args)
1040
1042
  spawn.annotate!(*args)
@@ -1157,8 +1159,8 @@ module ActiveRecord
1157
1159
  annotates = annotates.uniq if annotates.size > 1
1158
1160
  unless annotates == annotate_values
1159
1161
  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
1162
+ Duplicated query annotations are no longer shown in queries in Rails 7.0.
1163
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations
1162
1164
  (`#{klass.name&.tableize || klass.table_name}.uniq!(:annotate)`).
1163
1165
  MSG
1164
1166
  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
@@ -268,7 +268,7 @@ module ActiveRecord
268
268
  end
269
269
 
270
270
  def dump(obj)
271
- @coder.dump self.class.as_indifferent_hash(obj)
271
+ @coder.dump as_regular_hash(obj)
272
272
  end
273
273
 
274
274
  def load(yaml)
@@ -285,6 +285,11 @@ module ActiveRecord
285
285
  ActiveSupport::HashWithIndifferentAccess.new
286
286
  end
287
287
  end
288
+
289
+ private
290
+ def as_regular_hash(obj)
291
+ obj.respond_to?(:to_hash) ? obj.to_hash : {}
292
+ end
288
293
  end
289
294
  end
290
295
  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
@@ -134,7 +134,7 @@ module ActiveRecord
134
134
  @connection_subscriber = ActiveSupport::Notifications.subscribe("!connection.active_record") do |_, _, _, _, payload|
135
135
  spec_name = payload[:spec_name] if payload.key?(:spec_name)
136
136
  shard = payload[:shard] if payload.key?(:shard)
137
- setup_shared_connection_pool
137
+ setup_shared_connection_pool if ActiveRecord::Base.legacy_connection_handling
138
138
 
139
139
  if spec_name
140
140
  begin
@@ -143,10 +143,14 @@ module ActiveRecord
143
143
  connection = nil
144
144
  end
145
145
 
146
- if connection && !@fixture_connections.include?(connection)
147
- connection.begin_transaction joinable: false, _lazy: false
148
- connection.pool.lock_thread = true if lock_threads
149
- @fixture_connections << connection
146
+ if connection
147
+ setup_shared_connection_pool unless ActiveRecord::Base.legacy_connection_handling
148
+
149
+ if !@fixture_connections.include?(connection)
150
+ connection.begin_transaction joinable: false, _lazy: false
151
+ connection.pool.lock_thread = true if lock_threads
152
+ @fixture_connections << connection
153
+ end
150
154
  end
151
155
  end
152
156
  end
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.7
4
+ version: 6.1.7.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-03-08 00:00:00.000000000 Z
11
+ date: 2023-01-17 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.7
19
+ version: 6.1.7.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.7
26
+ version: 6.1.7.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.7
33
+ version: 6.1.7.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.7
40
+ version: 6.1.7.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.7/activerecord/CHANGELOG.md
394
- documentation_uri: https://api.rubyonrails.org/v6.1.4.7/
393
+ changelog_uri: https://github.com/rails/rails/blob/v6.1.7.1/activerecord/CHANGELOG.md
394
+ documentation_uri: https://api.rubyonrails.org/v6.1.7.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.7/activerecord
396
+ source_code_uri: https://github.com/rails/rails/tree/v6.1.7.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.1.6
415
+ rubygems_version: 3.4.3
415
416
  signing_key:
416
417
  specification_version: 4
417
418
  summary: Object-relational mapper framework (part of Rails).