activerecord 6.0.0.rc2 → 6.0.1.rc1

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +101 -3
  3. data/lib/active_record/association_relation.rb +15 -6
  4. data/lib/active_record/associations.rb +1 -1
  5. data/lib/active_record/associations/association.rb +9 -1
  6. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -1
  7. data/lib/active_record/associations/join_dependency.rb +4 -0
  8. data/lib/active_record/associations/join_dependency/join_association.rb +1 -1
  9. data/lib/active_record/associations/preloader.rb +1 -1
  10. data/lib/active_record/autosave_association.rb +7 -3
  11. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +25 -10
  12. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -0
  13. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -1
  14. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1 -1
  15. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -3
  16. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +13 -4
  17. data/lib/active_record/connection_adapters/connection_specification.rb +2 -2
  18. data/lib/active_record/connection_adapters/mysql/database_statements.rb +3 -1
  19. data/lib/active_record/connection_adapters/mysql2_adapter.rb +2 -2
  20. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +3 -1
  21. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  22. data/lib/active_record/connection_adapters/postgresql_adapter.rb +4 -0
  23. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +3 -1
  24. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +4 -0
  25. data/lib/active_record/connection_handling.rb +11 -4
  26. data/lib/active_record/core.rb +8 -4
  27. data/lib/active_record/database_configurations.rb +60 -31
  28. data/lib/active_record/enum.rb +9 -0
  29. data/lib/active_record/fixtures.rb +11 -6
  30. data/lib/active_record/gem_version.rb +2 -2
  31. data/lib/active_record/insert_all.rb +2 -3
  32. data/lib/active_record/middleware/database_selector/resolver.rb +4 -6
  33. data/lib/active_record/migration.rb +13 -5
  34. data/lib/active_record/model_schema.rb +3 -0
  35. data/lib/active_record/railties/databases.rake +6 -3
  36. data/lib/active_record/relation.rb +1 -0
  37. data/lib/active_record/relation/calculations.rb +1 -3
  38. data/lib/active_record/relation/finder_methods.rb +10 -1
  39. data/lib/active_record/relation/query_methods.rb +47 -21
  40. data/lib/active_record/tasks/database_tasks.rb +35 -0
  41. data/lib/active_record/tasks/mysql_database_tasks.rb +1 -1
  42. data/lib/active_record/test_databases.rb +1 -16
  43. data/lib/active_record/transactions.rb +1 -1
  44. data/lib/active_record/validations.rb +1 -0
  45. data/lib/arel.rb +12 -5
  46. metadata +12 -9
@@ -46,11 +46,9 @@ module ActiveRecord
46
46
  private
47
47
 
48
48
  def read_from_primary(&blk)
49
- ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role) do
50
- ActiveRecord::Base.connection_handler.while_preventing_writes do
51
- instrumenter.instrument("database_selector.active_record.read_from_primary") do
52
- yield
53
- end
49
+ ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role, prevent_writes: true) do
50
+ instrumenter.instrument("database_selector.active_record.read_from_primary") do
51
+ yield
54
52
  end
55
53
  end
56
54
  end
@@ -64,7 +62,7 @@ module ActiveRecord
64
62
  end
65
63
 
66
64
  def write_to_primary(&blk)
67
- ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role) do
65
+ ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role, prevent_writes: false) do
68
66
  instrumenter.instrument("database_selector.active_record.wrote_to_primary") do
69
67
  yield
70
68
  ensure
@@ -588,18 +588,26 @@ module ActiveRecord
588
588
  end
589
589
 
590
590
  def load_schema_if_pending!
591
- if Base.connection.migration_context.needs_migration? || !Base.connection.migration_context.any_migrations?
591
+ current_config = Base.connection_config
592
+ all_configs = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env)
593
+
594
+ needs_update = !all_configs.all? do |db_config|
595
+ Tasks::DatabaseTasks.schema_up_to_date?(db_config.config, ActiveRecord::Base.schema_format, nil, Rails.env, db_config.spec_name)
596
+ end
597
+
598
+ if needs_update
592
599
  # Roundtrip to Rake to allow plugins to hook into database initialization.
593
600
  root = defined?(ENGINE_ROOT) ? ENGINE_ROOT : Rails.root
594
601
  FileUtils.cd(root) do
595
- current_config = Base.connection_config
596
602
  Base.clear_all_connections!
597
603
  system("bin/rails db:test:prepare")
598
- # Establish a new connection, the old database may be gone (db:test:prepare uses purge)
599
- Base.establish_connection(current_config)
600
604
  end
601
- check_pending!
602
605
  end
606
+
607
+ # Establish a new connection, the old database may be gone (db:test:prepare uses purge)
608
+ Base.establish_connection(current_config)
609
+
610
+ check_pending!
603
611
  end
604
612
 
605
613
  def maintain_test_schema! #:nodoc:
@@ -480,6 +480,9 @@ module ActiveRecord
480
480
  load_schema!
481
481
 
482
482
  @schema_loaded = true
483
+ rescue
484
+ reload_schema_from_cache # If the schema loading failed half way through, we must reset the state.
485
+ raise
483
486
  end
484
487
  end
485
488
 
@@ -265,6 +265,8 @@ db_namespace = namespace :db do
265
265
  end
266
266
  abort %{Run `rails db:migrate` to update your database then try again.}
267
267
  end
268
+ ensure
269
+ ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
268
270
  end
269
271
 
270
272
  namespace :abort_if_pending_migrations do
@@ -297,10 +299,11 @@ db_namespace = namespace :db do
297
299
  ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
298
300
  ActiveRecord::Base.establish_connection(db_config.config)
299
301
 
300
- ActiveRecord::Tasks::DatabaseTasks.migrate
301
-
302
302
  # Skipped when no database
303
- ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config.config, ActiveRecord::Base.schema_format, db_config.spec_name)
303
+ ActiveRecord::Tasks::DatabaseTasks.migrate
304
+ if ActiveRecord::Base.dump_schema_after_migration
305
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config.config, ActiveRecord::Base.schema_format, db_config.spec_name)
306
+ end
304
307
 
305
308
  rescue ActiveRecord::NoDatabaseError
306
309
  ActiveRecord::Tasks::DatabaseTasks.create_current(db_config.env_name, db_config.spec_name)
@@ -629,6 +629,7 @@ module ActiveRecord
629
629
  @to_sql = @arel = @loaded = @should_eager_load = nil
630
630
  @records = [].freeze
631
631
  @offsets = {}
632
+ @take = nil
632
633
  self
633
634
  end
634
635
 
@@ -321,7 +321,7 @@ module ActiveRecord
321
321
  }
322
322
  group_columns = group_aliases.zip(group_fields)
323
323
 
324
- aggregate_alias = column_alias_for("#{operation}_#{column_name.to_s.downcase}")
324
+ aggregate_alias = column_alias_for("#{operation} #{column_name.to_s.downcase}")
325
325
 
326
326
  select_values = [
327
327
  operation_over_aggregate_column(
@@ -374,8 +374,6 @@ module ActiveRecord
374
374
  # column_alias_for("count(distinct users.id)") # => "count_distinct_users_id"
375
375
  # column_alias_for("count(*)") # => "count_all"
376
376
  def column_alias_for(field)
377
- return field if field.match?(/\A\w{,#{connection.table_alias_length}}\z/)
378
-
379
377
  column_alias = +field
380
378
  column_alias.gsub!(/\*/, "all")
381
379
  column_alias.gsub!(/\W+/, " ")
@@ -376,7 +376,16 @@ module ActiveRecord
376
376
  )
377
377
  relation = except(:includes, :eager_load, :preload).joins!(join_dependency)
378
378
 
379
- if eager_loading && !using_limitable_reflections?(join_dependency.reflections)
379
+ if eager_loading && !(
380
+ using_limitable_reflections?(join_dependency.reflections) &&
381
+ using_limitable_reflections?(
382
+ construct_join_dependency(
383
+ select_association_list(joins_values).concat(
384
+ select_association_list(left_outer_joins_values)
385
+ ), nil
386
+ ).reflections
387
+ )
388
+ )
380
389
  if has_limit_or_offset?
381
390
  limited_ids = limited_ids_for(relation)
382
391
  limited_ids.empty? ? relation.none! : relation.where!(primary_key => limited_ids)
@@ -372,7 +372,7 @@ module ActiveRecord
372
372
 
373
373
  # Same as #reorder but operates on relation in-place instead of copying.
374
374
  def reorder!(*args) # :nodoc:
375
- preprocess_order_args(args)
375
+ preprocess_order_args(args) unless args.all?(&:blank?)
376
376
 
377
377
  self.reordering_value = true
378
378
  self.order_values = args
@@ -1083,38 +1083,68 @@ module ActiveRecord
1083
1083
  end
1084
1084
  end
1085
1085
 
1086
- def valid_association_list(associations)
1086
+ def select_association_list(associations)
1087
+ result = []
1087
1088
  associations.each do |association|
1088
1089
  case association
1089
1090
  when Hash, Symbol, Array
1090
- # valid
1091
+ result << association
1091
1092
  else
1092
- raise ArgumentError, "only Hash, Symbol and Array are allowed"
1093
+ yield if block_given?
1093
1094
  end
1094
1095
  end
1096
+ result
1097
+ end
1098
+
1099
+ def valid_association_list(associations)
1100
+ select_association_list(associations) do
1101
+ raise ArgumentError, "only Hash, Symbol and Array are allowed"
1102
+ end
1095
1103
  end
1096
1104
 
1097
1105
  def build_left_outer_joins(manager, outer_joins, aliases)
1098
- buckets = { association_join: valid_association_list(outer_joins) }
1106
+ buckets = Hash.new { |h, k| h[k] = [] }
1107
+ buckets[:association_join] = valid_association_list(outer_joins)
1099
1108
  build_join_query(manager, buckets, Arel::Nodes::OuterJoin, aliases)
1100
1109
  end
1101
1110
 
1102
1111
  def build_joins(manager, joins, aliases)
1112
+ buckets = Hash.new { |h, k| h[k] = [] }
1113
+
1103
1114
  unless left_outer_joins_values.empty?
1104
1115
  left_joins = valid_association_list(left_outer_joins_values.flatten)
1105
- joins.unshift construct_join_dependency(left_joins, Arel::Nodes::OuterJoin)
1116
+ buckets[:stashed_join] << construct_join_dependency(left_joins, Arel::Nodes::OuterJoin)
1117
+ end
1118
+
1119
+ if joins.last.is_a?(ActiveRecord::Associations::JoinDependency)
1120
+ buckets[:stashed_join] << joins.pop if joins.last.base_klass == klass
1106
1121
  end
1107
1122
 
1108
- buckets = joins.group_by do |join|
1123
+ joins.map! do |join|
1124
+ if join.is_a?(String)
1125
+ table.create_string_join(Arel.sql(join.strip)) unless join.blank?
1126
+ else
1127
+ join
1128
+ end
1129
+ end.delete_if(&:blank?).uniq!
1130
+
1131
+ while joins.first.is_a?(Arel::Nodes::Join)
1132
+ join_node = joins.shift
1133
+ if join_node.is_a?(Arel::Nodes::StringJoin) && !buckets[:stashed_join].empty?
1134
+ buckets[:join_node] << join_node
1135
+ else
1136
+ buckets[:leading_join] << join_node
1137
+ end
1138
+ end
1139
+
1140
+ joins.each do |join|
1109
1141
  case join
1110
- when String
1111
- :string_join
1112
1142
  when Hash, Symbol, Array
1113
- :association_join
1143
+ buckets[:association_join] << join
1114
1144
  when ActiveRecord::Associations::JoinDependency
1115
- :stashed_join
1145
+ buckets[:stashed_join] << join
1116
1146
  when Arel::Nodes::Join
1117
- :join_node
1147
+ buckets[:join_node] << join
1118
1148
  else
1119
1149
  raise "unknown class: %s" % join.class.name
1120
1150
  end
@@ -1124,25 +1154,21 @@ module ActiveRecord
1124
1154
  end
1125
1155
 
1126
1156
  def build_join_query(manager, buckets, join_type, aliases)
1127
- buckets.default = []
1128
-
1129
1157
  association_joins = buckets[:association_join]
1130
1158
  stashed_joins = buckets[:stashed_join]
1131
- join_nodes = buckets[:join_node].tap(&:uniq!)
1132
- string_joins = buckets[:string_join].delete_if(&:blank?).map!(&:strip).tap(&:uniq!)
1133
-
1134
- string_joins.map! { |join| table.create_string_join(Arel.sql(join)) }
1159
+ leading_joins = buckets[:leading_join]
1160
+ join_nodes = buckets[:join_node]
1135
1161
 
1136
1162
  join_sources = manager.join_sources
1137
- join_sources.concat(join_nodes) unless join_nodes.empty?
1163
+ join_sources.concat(leading_joins) unless leading_joins.empty?
1138
1164
 
1139
1165
  unless association_joins.empty? && stashed_joins.empty?
1140
- alias_tracker = alias_tracker(join_nodes + string_joins, aliases)
1166
+ alias_tracker = alias_tracker(leading_joins + join_nodes, aliases)
1141
1167
  join_dependency = construct_join_dependency(association_joins, join_type)
1142
1168
  join_sources.concat(join_dependency.join_constraints(stashed_joins, alias_tracker))
1143
1169
  end
1144
1170
 
1145
- join_sources.concat(string_joins) unless string_joins.empty?
1171
+ join_sources.concat(join_nodes) unless join_nodes.empty?
1146
1172
  end
1147
1173
 
1148
1174
  def build_select(arel)
@@ -154,6 +154,8 @@ module ActiveRecord
154
154
  end
155
155
 
156
156
  def for_each(databases)
157
+ return {} unless defined?(Rails)
158
+
157
159
  database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
158
160
 
159
161
  # if this is a single database application we don't want tasks for each primary database
@@ -331,10 +333,39 @@ module ActiveRecord
331
333
  end
332
334
  ActiveRecord::InternalMetadata.create_table
333
335
  ActiveRecord::InternalMetadata[:environment] = environment
336
+ ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
334
337
  ensure
335
338
  Migration.verbose = verbose_was
336
339
  end
337
340
 
341
+ def schema_up_to_date?(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary")
342
+ file ||= dump_filename(spec_name, format)
343
+
344
+ return true unless File.exist?(file)
345
+
346
+ ActiveRecord::Base.establish_connection(configuration)
347
+ return false unless ActiveRecord::InternalMetadata.table_exists?
348
+ ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
349
+ end
350
+
351
+ def reconstruct_from_schema(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary") # :nodoc:
352
+ file ||= dump_filename(spec_name, format)
353
+
354
+ check_schema_file(file)
355
+
356
+ ActiveRecord::Base.establish_connection(configuration)
357
+
358
+ if schema_up_to_date?(configuration, format, file, environment, spec_name)
359
+ truncate_tables(configuration)
360
+ else
361
+ purge(configuration)
362
+ load_schema(configuration, format, file, environment, spec_name)
363
+ end
364
+ rescue ActiveRecord::NoDatabaseError
365
+ create(configuration)
366
+ load_schema(configuration, format, file, environment, spec_name)
367
+ end
368
+
338
369
  def dump_schema(configuration, format = ActiveRecord::Base.schema_format, spec_name = "primary") # :nodoc:
339
370
  require "active_record/schema_dumper"
340
371
  filename = dump_filename(spec_name, format)
@@ -466,6 +497,10 @@ module ActiveRecord
466
497
  def local_database?(configuration)
467
498
  configuration["host"].blank? || LOCAL_HOSTS.include?(configuration["host"])
468
499
  end
500
+
501
+ def schema_sha1(file)
502
+ Digest::SHA1.hexdigest(File.read(file))
503
+ end
469
504
  end
470
505
  end
471
506
  end
@@ -16,7 +16,7 @@ module ActiveRecord
16
16
  connection.create_database configuration["database"], creation_options
17
17
  establish_connection configuration
18
18
  rescue ActiveRecord::StatementInvalid => error
19
- if error.cause.error_number == ER_DB_CREATE_EXISTS
19
+ if connection.error_number(error.cause) == ER_DB_CREATE_EXISTS
20
20
  raise DatabaseAlreadyExists
21
21
  else
22
22
  raise
@@ -8,31 +8,16 @@ module ActiveRecord
8
8
  create_and_load_schema(i, env_name: Rails.env)
9
9
  end
10
10
 
11
- ActiveSupport::Testing::Parallelization.run_cleanup_hook do
12
- drop(env_name: Rails.env)
13
- end
14
-
15
11
  def self.create_and_load_schema(i, env_name:)
16
12
  old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
17
13
 
18
14
  ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
19
15
  db_config.config["database"] += "-#{i}"
20
- ActiveRecord::Tasks::DatabaseTasks.create(db_config.config)
21
- ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
16
+ ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
22
17
  end
23
18
  ensure
24
19
  ActiveRecord::Base.establish_connection(Rails.env.to_sym)
25
20
  ENV["VERBOSE"] = old
26
21
  end
27
-
28
- def self.drop(env_name:)
29
- old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
30
-
31
- ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
32
- ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
33
- end
34
- ensure
35
- ENV["VERBOSE"] = old
36
- end
37
22
  end
38
23
  end
@@ -333,6 +333,7 @@ module ActiveRecord
333
333
  # Ensure that it is not called if the object was never persisted (failed create),
334
334
  # but call it after the commit of a destroyed object.
335
335
  def committed!(should_run_callbacks: true) #:nodoc:
336
+ force_clear_transaction_record_state
336
337
  if should_run_callbacks
337
338
  @_committed_already_called = true
338
339
  _run_commit_without_transaction_enrollment_callbacks
@@ -340,7 +341,6 @@ module ActiveRecord
340
341
  end
341
342
  ensure
342
343
  @_committed_already_called = false
343
- force_clear_transaction_record_state
344
344
  end
345
345
 
346
346
  # Call the #after_rollback callbacks. The +force_restore_state+ argument indicates if the record
@@ -40,6 +40,7 @@ module ActiveRecord
40
40
  include ActiveModel::Validations
41
41
 
42
42
  # The validation process on save can be skipped by passing <tt>validate: false</tt>.
43
+ # The validation context can be changed by passing <tt>context: context</tt>.
43
44
  # The regular {ActiveRecord::Base#save}[rdoc-ref:Persistence#save] method is replaced
44
45
  # with this when the validations module is mixed in, which it is by default.
45
46
  def save(options = {})
@@ -24,22 +24,29 @@ require "arel/update_manager"
24
24
  require "arel/delete_manager"
25
25
  require "arel/nodes"
26
26
 
27
- module Arel # :nodoc: all
27
+ module Arel
28
28
  VERSION = "10.0.0"
29
29
 
30
+ # Wrap a known-safe SQL string for passing to query methods, e.g.
31
+ #
32
+ # Post.order(Arel.sql("length(title)")).last
33
+ #
34
+ # Great caution should be taken to avoid SQL injection vulnerabilities.
35
+ # This method should not be used with unsafe values such as request
36
+ # parameters or model attributes.
30
37
  def self.sql(raw_sql)
31
38
  Arel::Nodes::SqlLiteral.new raw_sql
32
39
  end
33
40
 
34
- def self.star
41
+ def self.star # :nodoc:
35
42
  sql "*"
36
43
  end
37
44
 
38
- def self.arel_node?(value)
45
+ def self.arel_node?(value) # :nodoc:
39
46
  value.is_a?(Arel::Node) || value.is_a?(Arel::Attribute) || value.is_a?(Arel::Nodes::SqlLiteral)
40
47
  end
41
48
 
42
- def self.fetch_attribute(value)
49
+ def self.fetch_attribute(value) # :nodoc:
43
50
  case value
44
51
  when Arel::Nodes::Between, Arel::Nodes::In, Arel::Nodes::NotIn, Arel::Nodes::Equality, Arel::Nodes::NotEqual, Arel::Nodes::LessThan, Arel::Nodes::LessThanOrEqual, Arel::Nodes::GreaterThan, Arel::Nodes::GreaterThanOrEqual
45
52
  yield value.left.is_a?(Arel::Attributes::Attribute) ? value.left : value.right
@@ -47,5 +54,5 @@ module Arel # :nodoc: all
47
54
  end
48
55
 
49
56
  ## Convenience Alias
50
- Node = Arel::Nodes::Node
57
+ Node = Arel::Nodes::Node # :nodoc:
51
58
  end
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.0.0.rc2
4
+ version: 6.0.1.rc1
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: 2019-07-22 00:00:00.000000000 Z
11
+ date: 2019-10-31 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.0.0.rc2
19
+ version: 6.0.1.rc1
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.0.0.rc2
26
+ version: 6.0.1.rc1
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.0.0.rc2
33
+ version: 6.0.1.rc1
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.0.0.rc2
40
+ version: 6.0.1.rc1
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.
@@ -389,8 +389,11 @@ homepage: https://rubyonrails.org
389
389
  licenses:
390
390
  - MIT
391
391
  metadata:
392
- source_code_uri: https://github.com/rails/rails/tree/v6.0.0.rc2/activerecord
393
- changelog_uri: https://github.com/rails/rails/blob/v6.0.0.rc2/activerecord/CHANGELOG.md
392
+ bug_tracker_uri: https://github.com/rails/rails/issues
393
+ changelog_uri: https://github.com/rails/rails/blob/v6.0.1.rc1/activerecord/CHANGELOG.md
394
+ documentation_uri: https://api.rubyonrails.org/v6.0.1.rc1/
395
+ mailing_list_uri: https://groups.google.com/forum/#!forum/rubyonrails-talk
396
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.1.rc1/activerecord
394
397
  post_install_message:
395
398
  rdoc_options:
396
399
  - "--main"
@@ -408,7 +411,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
408
411
  - !ruby/object:Gem::Version
409
412
  version: 1.3.1
410
413
  requirements: []
411
- rubygems_version: 3.0.1
414
+ rubygems_version: 3.0.3
412
415
  signing_key:
413
416
  specification_version: 4
414
417
  summary: Object-relational mapper framework (part of Rails).