activerecord 8.0.2 → 8.0.3

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +143 -2
  3. data/README.rdoc +1 -1
  4. data/lib/active_record/associations/belongs_to_association.rb +9 -1
  5. data/lib/active_record/associations/collection_association.rb +3 -3
  6. data/lib/active_record/attribute_methods/query.rb +34 -0
  7. data/lib/active_record/attribute_methods/serialization.rb +1 -1
  8. data/lib/active_record/attribute_methods.rb +1 -1
  9. data/lib/active_record/attributes.rb +35 -24
  10. data/lib/active_record/autosave_association.rb +1 -1
  11. data/lib/active_record/base.rb +2 -2
  12. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +1 -1
  13. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +8 -4
  14. data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -6
  15. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +4 -1
  16. data/lib/active_record/connection_adapters/abstract_adapter.rb +3 -1
  17. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +9 -2
  18. data/lib/active_record/connection_adapters/postgresql_adapter.rb +2 -2
  19. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +2 -2
  20. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +2 -2
  21. data/lib/active_record/connection_handling.rb +1 -1
  22. data/lib/active_record/core.rb +8 -6
  23. data/lib/active_record/database_configurations/hash_config.rb +8 -2
  24. data/lib/active_record/delegated_type.rb +1 -1
  25. data/lib/active_record/encryption/encryptable_record.rb +1 -1
  26. data/lib/active_record/encryption/encrypted_attribute_type.rb +1 -1
  27. data/lib/active_record/encryption/encryptor.rb +27 -25
  28. data/lib/active_record/enum.rb +13 -12
  29. data/lib/active_record/errors.rb +3 -3
  30. data/lib/active_record/fixture_set/table_row.rb +19 -2
  31. data/lib/active_record/gem_version.rb +1 -1
  32. data/lib/active_record/migration.rb +5 -5
  33. data/lib/active_record/query_logs.rb +4 -0
  34. data/lib/active_record/querying.rb +4 -4
  35. data/lib/active_record/railtie.rb +2 -2
  36. data/lib/active_record/railties/databases.rake +8 -16
  37. data/lib/active_record/relation/calculations.rb +15 -16
  38. data/lib/active_record/relation/finder_methods.rb +14 -13
  39. data/lib/active_record/relation/query_methods.rb +4 -4
  40. data/lib/active_record/relation/spawn_methods.rb +6 -6
  41. data/lib/active_record/relation/where_clause.rb +8 -2
  42. data/lib/active_record/relation.rb +14 -4
  43. data/lib/active_record/secure_token.rb +3 -3
  44. data/lib/active_record/signed_id.rb +3 -3
  45. data/lib/active_record/tasks/database_tasks.rb +22 -14
  46. data/lib/active_record/tasks/postgresql_database_tasks.rb +9 -1
  47. data/lib/active_record/test_databases.rb +1 -1
  48. data/lib/active_record/transactions.rb +3 -1
  49. data/lib/active_record.rb +3 -2
  50. data/lib/arel/crud.rb +2 -0
  51. data/lib/arel/delete_manager.rb +5 -0
  52. data/lib/arel/nodes/delete_statement.rb +4 -2
  53. data/lib/arel/nodes/update_statement.rb +4 -2
  54. data/lib/arel/select_manager.rb +6 -2
  55. data/lib/arel/update_manager.rb +5 -0
  56. data/lib/arel/visitors/dot.rb +2 -0
  57. data/lib/arel/visitors/to_sql.rb +2 -0
  58. metadata +10 -10
@@ -52,18 +52,18 @@ module ActiveRecord
52
52
  end
53
53
  end
54
54
 
55
- # Removes from the query the condition(s) specified in +skips+.
55
+ # Removes the condition(s) specified in +skips+ from the query.
56
56
  #
57
- # Post.order('id asc').except(:order) # discards the order condition
58
- # Post.where('id > 10').order('id asc').except(:where) # discards the where condition but keeps the order
57
+ # Post.order('id asc').except(:order) # removes the order condition
58
+ # Post.where('id > 10').order('id asc').except(:where) # removes the where condition but keeps the order
59
59
  def except(*skips)
60
60
  relation_with values.except(*skips)
61
61
  end
62
62
 
63
- # Removes any condition from the query other than the one(s) specified in +onlies+.
63
+ # Keeps only the condition(s) specified in +onlies+ in the query, removing all others.
64
64
  #
65
- # Post.order('id asc').only(:where) # discards the order condition
66
- # Post.order('id asc').only(:where, :order) # uses the specified order
65
+ # Post.order('id asc').only(:where) # keeps only the where condition, removes the order
66
+ # Post.order('id asc').only(:where, :order) # keeps only the where and order conditions
67
67
  def only(*onlies)
68
68
  relation_with values.slice(*onlies)
69
69
  end
@@ -135,10 +135,14 @@ module ActiveRecord
135
135
 
136
136
  def extract_attribute(node)
137
137
  attr_node = nil
138
- Arel.fetch_attribute(node) do |attr|
139
- return if attr_node&.!= attr # all attr nodes should be the same
138
+
139
+ valid_attrs = Arel.fetch_attribute(node) do |attr|
140
+ !attr_node || attr_node == attr # all attr nodes should be the same
141
+ ensure
140
142
  attr_node = attr
141
143
  end
144
+ return unless valid_attrs # all nested nodes should yield an attribute
145
+
142
146
  attr_node
143
147
  end
144
148
 
@@ -172,6 +176,8 @@ module ActiveRecord
172
176
  end
173
177
 
174
178
  def except_predicates(columns)
179
+ return predicates if columns.empty?
180
+
175
181
  attrs = columns.extract! { |node| node.is_a?(Arel::Attribute) }
176
182
  non_attrs = columns.extract! { |node| node.is_a?(Arel::Predications) }
177
183
 
@@ -272,7 +272,12 @@ module ActiveRecord
272
272
  # such situation.
273
273
  def create_or_find_by(attributes, &block)
274
274
  with_connection do |connection|
275
- transaction(requires_new: true) { create(attributes, &block) }
275
+ record = nil
276
+ transaction(requires_new: true) do
277
+ record = create(attributes, &block)
278
+ record._last_transaction_return_status || raise(ActiveRecord::Rollback)
279
+ end
280
+ record
276
281
  rescue ActiveRecord::RecordNotUnique
277
282
  if connection.transaction_open?
278
283
  where(attributes).lock.find_by!(attributes)
@@ -287,7 +292,12 @@ module ActiveRecord
287
292
  # is raised if the created record is invalid.
288
293
  def create_or_find_by!(attributes, &block)
289
294
  with_connection do |connection|
290
- transaction(requires_new: true) { create!(attributes, &block) }
295
+ record = nil
296
+ transaction(requires_new: true) do
297
+ record = create!(attributes, &block)
298
+ record._last_transaction_return_status || raise(ActiveRecord::Rollback)
299
+ end
300
+ record
291
301
  rescue ActiveRecord::RecordNotUnique
292
302
  if connection.transaction_open?
293
303
  where(attributes).lock.find_by!(attributes)
@@ -297,7 +307,7 @@ module ActiveRecord
297
307
  end
298
308
  end
299
309
 
300
- # Like #find_or_create_by, but calls {new}[rdoc-ref:Core#new]
310
+ # Like #find_or_create_by, but calls {new}[rdoc-ref:Core.new]
301
311
  # instead of {create}[rdoc-ref:Persistence::ClassMethods#create].
302
312
  def find_or_initialize_by(attributes, &block)
303
313
  find_by(attributes) || new(attributes, &block)
@@ -949,7 +959,7 @@ module ActiveRecord
949
959
  # If attribute names are passed, they are updated along with +updated_at+/+updated_on+ attributes.
950
960
  # If no time argument is passed, the current time is used as default.
951
961
  #
952
- # === Examples
962
+ # ==== Examples
953
963
  #
954
964
  # # Touch all records
955
965
  # Person.all.touch_all
@@ -30,13 +30,13 @@ module ActiveRecord
30
30
  # {validates_uniqueness_of}[rdoc-ref:Validations::ClassMethods#validates_uniqueness_of] can.
31
31
  # You're encouraged to add a unique index in the database to deal with this even more unlikely scenario.
32
32
  #
33
- # === Options
33
+ # ==== Options
34
34
  #
35
- # [:length]
35
+ # [+:length+]
36
36
  # Length of the Secure Random, with a minimum of 24 characters. It will
37
37
  # default to 24.
38
38
  #
39
- # [:on]
39
+ # [+:on+]
40
40
  # The callback when the value is generated. When called with <tt>on:
41
41
  # :initialize</tt>, the value is generated in an
42
42
  # <tt>after_initialize</tt> callback, otherwise the value will be used
@@ -57,12 +57,12 @@ module ActiveRecord
57
57
  end
58
58
  end
59
59
 
60
- # Works like find_signed, but will raise an +ActiveSupport::MessageVerifier::InvalidSignature+
60
+ # Works like find_signed, but will raise an ActiveSupport::MessageVerifier::InvalidSignature
61
61
  # exception if the +signed_id+ has either expired, has a purpose mismatch, is for another record,
62
- # or has been tampered with. It will also raise an +ActiveRecord::RecordNotFound+ exception if
62
+ # or has been tampered with. It will also raise an ActiveRecord::RecordNotFound exception if
63
63
  # the valid signed id can't find a record.
64
64
  #
65
- # === Examples
65
+ # ==== Examples
66
66
  #
67
67
  # User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
68
68
  #
@@ -45,7 +45,7 @@ module ActiveRecord
45
45
  # Example:
46
46
  # ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = {
47
47
  # mysql2: ['--no-defaults', '--skip-add-drop-table'],
48
- # postgres: '--no-tablespaces'
48
+ # postgresql: '--no-tablespaces'
49
49
  # }
50
50
  mattr_accessor :structure_dump_flags, instance_accessor: false
51
51
 
@@ -373,7 +373,8 @@ module ActiveRecord
373
373
  database_adapter_for(db_config, *arguments).structure_load(filename, flags)
374
374
  end
375
375
 
376
- def load_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
376
+ def load_schema(db_config, format = db_config.schema_format, file = nil) # :nodoc:
377
+ format = format.to_sym
377
378
  file ||= schema_dump_path(db_config, format)
378
379
  return unless file
379
380
 
@@ -394,7 +395,7 @@ module ActiveRecord
394
395
  Migration.verbose = verbose_was
395
396
  end
396
397
 
397
- def schema_up_to_date?(configuration, format = ActiveRecord.schema_format, file = nil)
398
+ def schema_up_to_date?(configuration, _ = nil, file = nil)
398
399
  db_config = resolve_configuration(configuration)
399
400
 
400
401
  file ||= schema_dump_path(db_config)
@@ -410,25 +411,32 @@ module ActiveRecord
410
411
  end
411
412
  end
412
413
 
413
- def reconstruct_from_schema(db_config, format = ActiveRecord.schema_format, file = nil) # :nodoc:
414
- file ||= schema_dump_path(db_config, format)
414
+ def reconstruct_from_schema(db_config, file = nil) # :nodoc:
415
+ file ||= schema_dump_path(db_config, db_config.schema_format)
415
416
 
416
417
  check_schema_file(file) if file
417
418
 
418
419
  with_temporary_pool(db_config, clobber: true) do
419
- if schema_up_to_date?(db_config, format, file)
420
+ if schema_up_to_date?(db_config, nil, file)
420
421
  truncate_tables(db_config) unless ENV["SKIP_TEST_DATABASE_TRUNCATE"]
421
422
  else
422
423
  purge(db_config)
423
- load_schema(db_config, format, file)
424
+ load_schema(db_config, db_config.schema_format, file)
424
425
  end
425
426
  rescue ActiveRecord::NoDatabaseError
426
427
  create(db_config)
427
- load_schema(db_config, format, file)
428
+ load_schema(db_config, db_config.schema_format, file)
429
+ end
430
+ end
431
+
432
+ def dump_all
433
+ with_temporary_pool_for_each do |pool|
434
+ db_config = pool.db_config
435
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, ENV["SCHEMA_FORMAT"] || db_config.schema_format)
428
436
  end
429
437
  end
430
438
 
431
- def dump_schema(db_config, format = ActiveRecord.schema_format) # :nodoc:
439
+ def dump_schema(db_config, format = db_config.schema_format) # :nodoc:
432
440
  return unless db_config.schema_dump
433
441
 
434
442
  require "active_record/schema_dumper"
@@ -436,7 +444,7 @@ module ActiveRecord
436
444
  return unless filename
437
445
 
438
446
  FileUtils.mkdir_p(db_dir)
439
- case format
447
+ case format.to_sym
440
448
  when :ruby
441
449
  File.open(filename, "w:utf-8") do |file|
442
450
  ActiveRecord::SchemaDumper.dump(migration_connection_pool, file)
@@ -452,7 +460,7 @@ module ActiveRecord
452
460
  end
453
461
  end
454
462
 
455
- def schema_dump_path(db_config, format = ActiveRecord.schema_format)
463
+ def schema_dump_path(db_config, format = db_config.schema_format)
456
464
  return ENV["SCHEMA"] if ENV["SCHEMA"]
457
465
 
458
466
  filename = db_config.schema_dump(format)
@@ -471,10 +479,10 @@ module ActiveRecord
471
479
  db_config.default_schema_cache_path(ActiveRecord::Tasks::DatabaseTasks.db_dir)
472
480
  end
473
481
 
474
- def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
482
+ def load_schema_current(format = nil, file = nil, environment = env)
475
483
  each_current_configuration(environment) do |db_config|
476
484
  with_temporary_connection(db_config) do
477
- load_schema(db_config, format, file)
485
+ load_schema(db_config, format || db_config.schema_format, file)
478
486
  end
479
487
  end
480
488
  end
@@ -661,7 +669,7 @@ module ActiveRecord
661
669
  unless database_already_initialized
662
670
  schema_dump_path = schema_dump_path(db_config)
663
671
  if schema_dump_path && File.exist?(schema_dump_path)
664
- load_schema(db_config, ActiveRecord.schema_format, nil)
672
+ load_schema(db_config)
665
673
  end
666
674
  end
667
675
 
@@ -78,8 +78,9 @@ module ActiveRecord
78
78
  end
79
79
 
80
80
  def structure_load(filename, extra_flags)
81
- args = ["--set", ON_ERROR_STOP_1, "--quiet", "--no-psqlrc", "--output", File::NULL, "--file", filename]
81
+ args = ["--set", ON_ERROR_STOP_1, "--quiet", "--no-psqlrc", "--output", File::NULL]
82
82
  args.concat(Array(extra_flags)) if extra_flags
83
+ args.concat(["--file", filename])
83
84
  args << db_config.database
84
85
  run_cmd("psql", args, "loading")
85
86
  end
@@ -132,6 +133,13 @@ module ActiveRecord
132
133
  tempfile = Tempfile.open("uncommented_structure.sql")
133
134
  begin
134
135
  File.foreach(filename) do |line|
136
+ next if line.start_with?("\\restrict ")
137
+
138
+ if line.start_with?("\\unrestrict ")
139
+ removing_comments = true
140
+ next
141
+ end
142
+
135
143
  unless removing_comments && (line.start_with?(SQL_COMMENT_BEGIN) || line.blank?)
136
144
  tempfile << line
137
145
  removing_comments = false
@@ -14,7 +14,7 @@ module ActiveRecord
14
14
  ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
15
15
  db_config._database = "#{db_config.database}-#{i}"
16
16
 
17
- ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config, ActiveRecord.schema_format, nil)
17
+ ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config, nil)
18
18
  end
19
19
  ensure
20
20
  ActiveRecord::Base.establish_connection
@@ -13,7 +13,7 @@ module ActiveRecord
13
13
  scope: [:kind, :name]
14
14
  end
15
15
 
16
- attr_accessor :_new_record_before_last_commit # :nodoc:
16
+ attr_accessor :_new_record_before_last_commit, :_last_transaction_return_status # :nodoc:
17
17
 
18
18
  # = Active Record \Transactions
19
19
  #
@@ -417,6 +417,7 @@ module ActiveRecord
417
417
  status = yield
418
418
  raise ActiveRecord::Rollback unless status
419
419
  end
420
+ @_last_transaction_return_status = status
420
421
  status
421
422
  end
422
423
  end
@@ -432,6 +433,7 @@ module ActiveRecord
432
433
  def init_internals
433
434
  super
434
435
  @_start_transaction_state = nil
436
+ @_last_transaction_return_status = nil
435
437
  @_committed_already_called = nil
436
438
  @_new_record_before_last_commit = nil
437
439
  end
data/lib/active_record.rb CHANGED
@@ -87,7 +87,6 @@ module ActiveRecord
87
87
  autoload :Timestamp
88
88
  autoload :TokenFor
89
89
  autoload :TouchLater
90
- autoload :Transaction
91
90
  autoload :Transactions
92
91
  autoload :Translation
93
92
  autoload :Validations
@@ -109,6 +108,7 @@ module ActiveRecord
109
108
  autoload :Result
110
109
  autoload :StatementCache
111
110
  autoload :TableMetadata
111
+ autoload :Transaction
112
112
  autoload :Type
113
113
 
114
114
  autoload_under "relation" do
@@ -368,7 +368,8 @@ module ActiveRecord
368
368
  # specific) SQL statements. If :ruby, the schema is dumped as an
369
369
  # ActiveRecord::Schema file which can be loaded into any database that
370
370
  # supports migrations. Use :ruby if you want to have different database
371
- # adapters for, e.g., your development and test environments.
371
+ # adapters for, e.g., your development and test environments. This can be
372
+ # overridden per-database in the database configuration.
372
373
  singleton_class.attr_accessor :schema_format
373
374
  self.schema_format = :ruby
374
375
 
data/lib/arel/crud.rb CHANGED
@@ -26,6 +26,7 @@ module Arel # :nodoc: all
26
26
  um.offset(offset)
27
27
  um.order(*orders)
28
28
  um.wheres = constraints
29
+ um.comment(comment)
29
30
  um.key = key
30
31
 
31
32
  um.group(group_values_columns) unless group_values_columns.empty?
@@ -39,6 +40,7 @@ module Arel # :nodoc: all
39
40
  dm.offset(offset)
40
41
  dm.order(*orders)
41
42
  dm.wheres = constraints
43
+ dm.comment(comment)
42
44
  dm.key = key
43
45
  dm.group(group_values_columns) unless group_values_columns.empty?
44
46
  dm.having(having_clause) unless having_clause.nil?
@@ -28,5 +28,10 @@ module Arel # :nodoc: all
28
28
  @ast.havings << expr
29
29
  self
30
30
  end
31
+
32
+ def comment(value)
33
+ @ast.comment = value
34
+ self
35
+ end
31
36
  end
32
37
  end
@@ -3,7 +3,7 @@
3
3
  module Arel # :nodoc: all
4
4
  module Nodes
5
5
  class DeleteStatement < Arel::Nodes::Node
6
- attr_accessor :relation, :wheres, :groups, :havings, :orders, :limit, :offset, :key
6
+ attr_accessor :relation, :wheres, :groups, :havings, :orders, :limit, :offset, :comment, :key
7
7
 
8
8
  def initialize(relation = nil, wheres = [])
9
9
  super()
@@ -14,6 +14,7 @@ module Arel # :nodoc: all
14
14
  @orders = []
15
15
  @limit = nil
16
16
  @offset = nil
17
+ @comment = nil
17
18
  @key = nil
18
19
  end
19
20
 
@@ -24,7 +25,7 @@ module Arel # :nodoc: all
24
25
  end
25
26
 
26
27
  def hash
27
- [self.class, @relation, @wheres, @orders, @limit, @offset, @key].hash
28
+ [self.class, @relation, @wheres, @orders, @limit, @offset, @comment, @key].hash
28
29
  end
29
30
 
30
31
  def eql?(other)
@@ -36,6 +37,7 @@ module Arel # :nodoc: all
36
37
  self.havings == other.havings &&
37
38
  self.limit == other.limit &&
38
39
  self.offset == other.offset &&
40
+ self.comment == other.comment &&
39
41
  self.key == other.key
40
42
  end
41
43
  alias :== :eql?
@@ -3,7 +3,7 @@
3
3
  module Arel # :nodoc: all
4
4
  module Nodes
5
5
  class UpdateStatement < Arel::Nodes::Node
6
- attr_accessor :relation, :wheres, :values, :groups, :havings, :orders, :limit, :offset, :key
6
+ attr_accessor :relation, :wheres, :values, :groups, :havings, :orders, :limit, :offset, :comment, :key
7
7
 
8
8
  def initialize(relation = nil)
9
9
  super()
@@ -15,6 +15,7 @@ module Arel # :nodoc: all
15
15
  @orders = []
16
16
  @limit = nil
17
17
  @offset = nil
18
+ @comment = nil
18
19
  @key = nil
19
20
  end
20
21
 
@@ -25,7 +26,7 @@ module Arel # :nodoc: all
25
26
  end
26
27
 
27
28
  def hash
28
- [@relation, @wheres, @values, @orders, @limit, @offset, @key].hash
29
+ [@relation, @wheres, @values, @orders, @limit, @offset, @comment, @key].hash
29
30
  end
30
31
 
31
32
  def eql?(other)
@@ -38,6 +39,7 @@ module Arel # :nodoc: all
38
39
  self.orders == other.orders &&
39
40
  self.limit == other.limit &&
40
41
  self.offset == other.offset &&
42
+ self.comment == other.comment &&
41
43
  self.key == other.key
42
44
  end
43
45
  alias :== :eql?
@@ -250,8 +250,12 @@ module Arel # :nodoc: all
250
250
  end
251
251
 
252
252
  def comment(*values)
253
- @ctx.comment = Nodes::Comment.new(values)
254
- self
253
+ if values.any?
254
+ @ctx.comment = Nodes::Comment.new(values)
255
+ self
256
+ else
257
+ @ctx.comment
258
+ end
255
259
  end
256
260
 
257
261
  private
@@ -45,5 +45,10 @@ module Arel # :nodoc: all
45
45
  @ast.havings << expr
46
46
  self
47
47
  end
48
+
49
+ def comment(value)
50
+ @ast.comment = value
51
+ self
52
+ end
48
53
  end
49
54
  end
@@ -153,6 +153,7 @@ module Arel # :nodoc: all
153
153
  visit_edge o, "orders"
154
154
  visit_edge o, "limit"
155
155
  visit_edge o, "offset"
156
+ visit_edge o, "comment"
156
157
  visit_edge o, "key"
157
158
  end
158
159
 
@@ -162,6 +163,7 @@ module Arel # :nodoc: all
162
163
  visit_edge o, "orders"
163
164
  visit_edge o, "limit"
164
165
  visit_edge o, "offset"
166
+ visit_edge o, "comment"
165
167
  visit_edge o, "key"
166
168
  end
167
169
 
@@ -35,6 +35,7 @@ module Arel # :nodoc: all
35
35
  collect_nodes_for o.wheres, collector, " WHERE ", " AND "
36
36
  collect_nodes_for o.orders, collector, " ORDER BY "
37
37
  maybe_visit o.limit, collector
38
+ maybe_visit o.comment, collector
38
39
  end
39
40
 
40
41
  def visit_Arel_Nodes_UpdateStatement(o, collector)
@@ -48,6 +49,7 @@ module Arel # :nodoc: all
48
49
  collect_nodes_for o.wheres, collector, " WHERE ", " AND "
49
50
  collect_nodes_for o.orders, collector, " ORDER BY "
50
51
  maybe_visit o.limit, collector
52
+ maybe_visit o.comment, collector
51
53
  end
52
54
 
53
55
  def visit_Arel_Nodes_InsertStatement(o, collector)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.2
4
+ version: 8.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-12 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: activesupport
@@ -15,28 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 8.0.2
18
+ version: 8.0.3
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 8.0.2
25
+ version: 8.0.3
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activemodel
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - '='
31
31
  - !ruby/object:Gem::Version
32
- version: 8.0.2
32
+ version: 8.0.3
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: 8.0.2
39
+ version: 8.0.3
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: timeout
42
42
  requirement: !ruby/object:Gem::Requirement
@@ -474,10 +474,10 @@ licenses:
474
474
  - MIT
475
475
  metadata:
476
476
  bug_tracker_uri: https://github.com/rails/rails/issues
477
- changelog_uri: https://github.com/rails/rails/blob/v8.0.2/activerecord/CHANGELOG.md
478
- documentation_uri: https://api.rubyonrails.org/v8.0.2/
477
+ changelog_uri: https://github.com/rails/rails/blob/v8.0.3/activerecord/CHANGELOG.md
478
+ documentation_uri: https://api.rubyonrails.org/v8.0.3/
479
479
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
480
- source_code_uri: https://github.com/rails/rails/tree/v8.0.2/activerecord
480
+ source_code_uri: https://github.com/rails/rails/tree/v8.0.3/activerecord
481
481
  rubygems_mfa_required: 'true'
482
482
  rdoc_options:
483
483
  - "--main"
@@ -495,7 +495,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
495
495
  - !ruby/object:Gem::Version
496
496
  version: '0'
497
497
  requirements: []
498
- rubygems_version: 3.6.2
498
+ rubygems_version: 3.6.9
499
499
  specification_version: 4
500
500
  summary: Object-relational mapper framework (part of Rails).
501
501
  test_files: []