activerecord 7.1.0.rc2 → 7.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 105b6eb9b1f55cf060da5abef79eff897bc6cc4ffae4213d00bb60919716de1d
4
- data.tar.gz: b2001af69a5d854f66b1f3fd5fc3b2b96161e3185c1b0d11bbcfa606a0a8e3cf
3
+ metadata.gz: 3595eee8065caff3100f00f5ce54d1b3a34935759766cb16b4d8229a57ebc97e
4
+ data.tar.gz: 5fbab431bcbc3b56cae5b2d8400c893071c72ccc7feea3eb6d9343418c650ec6
5
5
  SHA512:
6
- metadata.gz: a65041e41aa694c421cb83cc41969088ec8c08f5d839fe87b7d9b43c91de2b72d3adb7419858e88fe711654d98b06bf9dad4d8bd6375f4370ff5e40e92782ffb
7
- data.tar.gz: 5b821a9ab05cd006337411118066eaf3e46219d8969a414406919a9725927b95e51d70f79d2723e165db58e93417354a697420c531cc53d435b8dd8405d502b1
6
+ metadata.gz: c75c3da922f3b0089112bb07c115787bedc1bb57a6e05aa04df893262554e09bf81e71898ac7ed24b1c80a00071818e14267cbffc2bb2b789755867b85f76d78
7
+ data.tar.gz: 5f6684e9a76e3a2a7156b687d4ac0701b9ddd840edd9c671f51031c534bdbd1e920b2aad65a479299383cb8555346a585e3167c353f33f95ecf8e05115438205
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## Rails 7.1.1 (October 11, 2023) ##
2
+
3
+ * Fix auto populating IDENTITY columns for PostgreSQL.
4
+
5
+ *fatkodima*
6
+
7
+ * Fix "ArgumentError: wrong number of arguments (given 3, expected 2)" when
8
+ down migrating `rename_table` in older migrations.
9
+
10
+ *fatkodima*
11
+
12
+ * Do not require the Action Text, Active Storage and Action Mailbox tables
13
+ to be present when running when running test on CI.
14
+
15
+ *Rafael Mendonça França*
16
+
17
+
18
+ ## Rails 7.1.0 (October 05, 2023) ##
19
+
20
+ * No changes.
21
+
22
+
1
23
  ## Rails 7.1.0.rc2 (October 01, 2023) ##
2
24
 
3
25
  * Remove -shm and -wal SQLite files when `rails db:drop` is run.
@@ -75,7 +75,7 @@ module ActiveRecord
75
75
  # for an Author.
76
76
  # - an Array which specifies multiple association names. This array
77
77
  # is processed recursively. For example, specifying <tt>[:avatar, :books]</tt>
78
- # allows this method to preload an author's avatar as well as all of his
78
+ # allows this method to preload an author's avatar as well as all of their
79
79
  # books.
80
80
  # - a Hash which specifies multiple association names, as well as
81
81
  # association names for the to-be-preloaded association objects. For
@@ -7,7 +7,7 @@ module ActiveRecord
7
7
  # = Active Record Attribute Methods \Dirty
8
8
  #
9
9
  # Provides a way to track changes in your Active Record models. It adds all
10
- # methods from ActiveModel::Dirty and adds database specific methods.
10
+ # methods from ActiveModel::Dirty and adds database-specific methods.
11
11
  #
12
12
  # A newly created +Person+ object is unchanged:
13
13
  #
@@ -673,7 +673,7 @@ module ActiveRecord
673
673
 
674
674
  def extract_table_ref_from_insert_sql(sql)
675
675
  if sql =~ /into\s("[A-Za-z0-9_."\[\]\s]+"|[A-Za-z0-9_."\[\]]+)\s*/im
676
- $1.strip
676
+ $1.delete('"').strip
677
677
  end
678
678
  end
679
679
  end
@@ -983,7 +983,6 @@ module ActiveRecord
983
983
  # Adds a reference. The reference column is a bigint by default,
984
984
  # the <tt>:type</tt> option can be used to specify a different type.
985
985
  # Optionally adds a +_type+ column, if <tt>:polymorphic</tt> option is provided.
986
- # #add_reference and #add_belongs_to are acceptable.
987
986
  #
988
987
  # The +options+ hash can include the following keys:
989
988
  # [<tt>:type</tt>]
@@ -1034,7 +1033,6 @@ module ActiveRecord
1034
1033
  alias :add_belongs_to :add_reference
1035
1034
 
1036
1035
  # Removes the reference(s). Also removes a +type+ column if one exists.
1037
- # #remove_reference and #remove_belongs_to are acceptable.
1038
1036
  #
1039
1037
  # ====== Remove the reference
1040
1038
  #
@@ -1400,7 +1398,7 @@ module ActiveRecord
1400
1398
 
1401
1399
  limited = relation.reselect(values).distinct!
1402
1400
  limited_ids = select_rows(limited.arel, "SQL").map do |results|
1403
- results.last(Array(relation.primary_key).length) # ignores order values for MySQL and Postgres
1401
+ results.last(Array(relation.primary_key).length) # ignores order values for MySQL and PostgreSQL
1404
1402
  end
1405
1403
 
1406
1404
  if limited_ids.empty?
@@ -82,8 +82,11 @@ module ActiveRecord
82
82
  @base_payload = payload
83
83
  end
84
84
 
85
+ class InstrumentationNotStartedError < ActiveRecordError; end
86
+ class InstrumentationAlreadyStartedError < ActiveRecordError; end
87
+
85
88
  def start
86
- return if @started
89
+ raise InstrumentationAlreadyStartedError.new("Called start on an already started transaction") if @started
87
90
  @started = true
88
91
 
89
92
  @payload = @base_payload.dup
@@ -92,7 +95,7 @@ module ActiveRecord
92
95
  end
93
96
 
94
97
  def finish(outcome)
95
- return unless @started
98
+ raise InstrumentationNotStartedError.new("Called finish on a transaction that hasn't started") unless @started
96
99
  @started = false
97
100
 
98
101
  @payload[:outcome] = outcome
@@ -166,7 +169,7 @@ module ActiveRecord
166
169
  end
167
170
 
168
171
  def incomplete!
169
- @instrumenter.finish(:incomplete)
172
+ @instrumenter.finish(:incomplete) if materialized?
170
173
  end
171
174
 
172
175
  def materialize!
@@ -180,6 +183,7 @@ module ActiveRecord
180
183
 
181
184
  def restore!
182
185
  if materialized?
186
+ incomplete!
183
187
  @materialized = false
184
188
  materialize!
185
189
  end
@@ -348,13 +352,13 @@ module ActiveRecord
348
352
  connection.rollback_to_savepoint(savepoint_name) if materialized?
349
353
  end
350
354
  @state.rollback!
351
- @instrumenter.finish(:rollback)
355
+ @instrumenter.finish(:rollback) if materialized?
352
356
  end
353
357
 
354
358
  def commit
355
359
  connection.release_savepoint(savepoint_name) if materialized?
356
360
  @state.commit!
357
- @instrumenter.finish(:commit)
361
+ @instrumenter.finish(:commit) if materialized?
358
362
  end
359
363
 
360
364
  def full_rollback?; false; end
@@ -389,13 +393,13 @@ module ActiveRecord
389
393
  def rollback
390
394
  connection.rollback_db_transaction if materialized?
391
395
  @state.full_rollback!
392
- @instrumenter.finish(:rollback)
396
+ @instrumenter.finish(:rollback) if materialized?
393
397
  end
394
398
 
395
399
  def commit
396
400
  connection.commit_db_transaction if materialized?
397
401
  @state.full_commit!
398
- @instrumenter.finish(:commit)
402
+ @instrumenter.finish(:commit) if materialized?
399
403
  end
400
404
  end
401
405
 
@@ -6,16 +6,24 @@ module ActiveRecord
6
6
  class Column < ConnectionAdapters::Column # :nodoc:
7
7
  delegate :oid, :fmod, to: :sql_type_metadata
8
8
 
9
- def initialize(*, serial: nil, generated: nil, **)
9
+ def initialize(*, serial: nil, identity: nil, generated: nil, **)
10
10
  super
11
11
  @serial = serial
12
+ @identity = identity
12
13
  @generated = generated
13
14
  end
14
15
 
16
+ def identity?
17
+ @identity
18
+ end
19
+
15
20
  def serial?
16
21
  @serial
17
22
  end
18
- alias_method :auto_incremented_by_db?, :serial?
23
+
24
+ def auto_incremented_by_db?
25
+ serial? || identity?
26
+ end
19
27
 
20
28
  def virtual?
21
29
  # We assume every generated column is virtual, no matter the concrete type
@@ -41,12 +49,14 @@ module ActiveRecord
41
49
 
42
50
  def init_with(coder)
43
51
  @serial = coder["serial"]
52
+ @identity = coder["identity"]
44
53
  @generated = coder["generated"]
45
54
  super
46
55
  end
47
56
 
48
57
  def encode_with(coder)
49
58
  coder["serial"] = @serial
59
+ coder["identity"] = @identity
50
60
  coder["generated"] = @generated
51
61
  super
52
62
  end
@@ -54,6 +64,7 @@ module ActiveRecord
54
64
  def ==(other)
55
65
  other.is_a?(Column) &&
56
66
  super &&
67
+ identity? == other.identity? &&
57
68
  serial? == other.serial?
58
69
  end
59
70
  alias :eql? :==
@@ -61,6 +72,7 @@ module ActiveRecord
61
72
  def hash
62
73
  Column.hash ^
63
74
  super.hash ^
75
+ identity?.hash ^
64
76
  serial?.hash
65
77
  end
66
78
  end
@@ -15,7 +15,7 @@ module ActiveRecord
15
15
  time = super
16
16
  return time if time.is_a?(ActiveSupport::TimeWithZone) || !time.acts_like?(:time)
17
17
 
18
- # While in UTC mode, the PG gem may not return times back in "UTC" even if they were provided to Postgres in UTC.
18
+ # While in UTC mode, the PG gem may not return times back in "UTC" even if they were provided to PostgreSQL in UTC.
19
19
  # We prefer times always in UTC, so here we convert back.
20
20
  if is_utc?
21
21
  time.getutc
@@ -149,6 +149,7 @@ module ActiveRecord
149
149
  end
150
150
 
151
151
  def lookup_cast_type_from_column(column) # :nodoc:
152
+ verify! if type_map.nil?
152
153
  type_map.lookup(column.oid, column.fmod, column.sql_type)
153
154
  end
154
155
 
@@ -908,7 +908,7 @@ module ActiveRecord
908
908
  end
909
909
 
910
910
  def new_column_from_field(table_name, field, _definitions)
911
- column_name, type, default, notnull, oid, fmod, collation, comment, attgenerated = field
911
+ column_name, type, default, notnull, oid, fmod, collation, comment, identity, attgenerated = field
912
912
  type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i)
913
913
  default_value = extract_value_from_default(default)
914
914
 
@@ -931,6 +931,7 @@ module ActiveRecord
931
931
  collation: collation,
932
932
  comment: comment.presence,
933
933
  serial: serial,
934
+ identity: identity.presence,
934
935
  generated: attgenerated
935
936
  )
936
937
  end
@@ -716,9 +716,7 @@ module ActiveRecord
716
716
  end
717
717
 
718
718
  private
719
- def type_map
720
- @type_map ||= Type::HashLookupTypeMap.new
721
- end
719
+ attr_reader :type_map
722
720
 
723
721
  def initialize_type_map(m = type_map)
724
722
  self.class.initialize_type_map(m)
@@ -1078,6 +1076,7 @@ module ActiveRecord
1078
1076
  SELECT a.attname, format_type(a.atttypid, a.atttypmod),
1079
1077
  pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
1080
1078
  c.collname, col_description(a.attrelid, a.attnum) AS comment,
1079
+ a.attidentity AS identity,
1081
1080
  #{supports_virtual_columns? ? 'attgenerated' : quote('')} as attgenerated
1082
1081
  FROM pg_attribute a
1083
1082
  LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
@@ -536,6 +536,27 @@ module ActiveRecord
536
536
  coder["active_record_yaml_version"] = 2
537
537
  end
538
538
 
539
+ ##
540
+ # :method: slice
541
+ #
542
+ # :call-seq: slice(*methods)
543
+ #
544
+ # Returns a hash of the given methods with their names as keys and returned
545
+ # values as values.
546
+ #
547
+ #--
548
+ # Implemented by ActiveModel::Access#slice.
549
+
550
+ ##
551
+ # :method: values_at
552
+ #
553
+ # :call-seq: values_at(*methods)
554
+ #
555
+ # Returns an array of the values returned by the given methods.
556
+ #
557
+ #--
558
+ # Implemented by ActiveModel::Access#values_at.
559
+
539
560
  # Returns true if +comparison_object+ is the same exact object, or +comparison_object+
540
561
  # is of the same type and +self+ has an ID and it is equal to +comparison_object.id+.
541
562
  #
@@ -701,27 +722,6 @@ module ActiveRecord
701
722
  end
702
723
  end
703
724
 
704
- ##
705
- # :method: values_at
706
- #
707
- # :call-seq: values_at(*methods)
708
- #
709
- # Returns an array of the values returned by the given methods.
710
- #
711
- #--
712
- # Implemented by ActiveModel::Access#values_at.
713
-
714
- ##
715
- # :method: slice
716
- #
717
- # :call-seq: slice(*methods)
718
- #
719
- # Returns a hash of the given methods with their names as keys and returned
720
- # values as values.
721
- #
722
- #--
723
- # Implemented by ActiveModel::Access#slice.
724
-
725
725
  private
726
726
  # +Array#flatten+ will call +#to_ary+ (recursively) on each of the elements of
727
727
  # the array, and then rescues from the possible +NoMethodError+. If those elements are
@@ -9,8 +9,8 @@ module ActiveRecord
9
9
  module VERSION
10
10
  MAJOR = 7
11
11
  MINOR = 1
12
- TINY = 0
13
- PRE = "rc2"
12
+ TINY = 1
13
+ PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -64,6 +64,8 @@ module ActiveRecord
64
64
  end
65
65
 
66
66
  def create_table_and_set_flags(environment, schema_sha1 = nil)
67
+ return unless enabled?
68
+
67
69
  create_table
68
70
  update_or_create_entry(:environment, environment)
69
71
  update_or_create_entry(:schema_sha1, schema_sha1) if schema_sha1
@@ -206,7 +206,10 @@ module ActiveRecord
206
206
  end
207
207
 
208
208
  def invert_rename_table(args)
209
- [:rename_table, args.reverse]
209
+ old_name, new_name, options = args
210
+ args = [new_name, old_name]
211
+ args << options if options
212
+ [:rename_table, args]
210
213
  end
211
214
 
212
215
  def invert_remove_column(args)
@@ -553,6 +553,20 @@ module ActiveRecord
553
553
  initialize_find_by_cache
554
554
  end
555
555
 
556
+ def load_schema # :nodoc:
557
+ return if schema_loaded?
558
+ @load_schema_monitor.synchronize do
559
+ return if @columns_hash
560
+
561
+ load_schema!
562
+
563
+ @schema_loaded = true
564
+ rescue
565
+ reload_schema_from_cache # If the schema loading failed half way through, we must reset the state.
566
+ raise
567
+ end
568
+ end
569
+
556
570
  protected
557
571
  def initialize_load_schema_monitor
558
572
  @load_schema_monitor = Monitor.new
@@ -594,20 +608,6 @@ module ActiveRecord
594
608
  defined?(@schema_loaded) && @schema_loaded
595
609
  end
596
610
 
597
- def load_schema
598
- return if schema_loaded?
599
- @load_schema_monitor.synchronize do
600
- return if @columns_hash
601
-
602
- load_schema!
603
-
604
- @schema_loaded = true
605
- rescue
606
- reload_schema_from_cache # If the schema loading failed half way through, we must reset the state.
607
- raise
608
- end
609
- end
610
-
611
611
  def load_schema!
612
612
  unless table_name
613
613
  raise ActiveRecord::TableNotSpecified, "#{self} has no table configured. Set one with #{self}.table_name="
@@ -283,13 +283,11 @@ module ActiveRecord
283
283
  #
284
284
  # === Creating forms with nested attributes
285
285
  #
286
- # Use ActionView::Helpers::FormHelper#fields_for to create form elements
287
- # for updating or destroying nested attributes.
286
+ # Use ActionView::Helpers::FormHelper#fields_for to create form elements for
287
+ # nested attributes.
288
288
  #
289
- # === Testing
290
- #
291
- # If you are using ActionView::Helpers::FormHelper#fields_for, your integration
292
- # tests should replicate the HTML structure it provides. For example;
289
+ # Integration test params should reflect the structure of the form. For
290
+ # example:
293
291
  #
294
292
  # post members_path, params: {
295
293
  # member: {
@@ -398,7 +398,7 @@ To keep using the current cache store, you can turn off cache versioning entirel
398
398
  end
399
399
 
400
400
  ActiveSupport.on_load(:active_record_fixture_set) do
401
- # Encrypt active record fixtures
401
+ # Encrypt Active Record fixtures
402
402
  if ActiveRecord::Encryption.config.encrypt_fixtures
403
403
  ActiveRecord::Fixture.prepend ActiveRecord::Encryption::EncryptedFixtures
404
404
  end
@@ -93,7 +93,8 @@ module ActiveRecord
93
93
  end
94
94
  end
95
95
 
96
- # Same as <tt>#count</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
96
+ # Same as #count, but performs the query asynchronously and returns an
97
+ # ActiveRecord::Promise.
97
98
  def async_count(column_name = nil)
98
99
  async.count(column_name)
99
100
  end
@@ -106,7 +107,8 @@ module ActiveRecord
106
107
  calculate(:average, column_name)
107
108
  end
108
109
 
109
- # Same as <tt>#average</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
110
+ # Same as #average, but performs the query asynchronously and returns an
111
+ # ActiveRecord::Promise.
110
112
  def async_average(column_name)
111
113
  async.average(column_name)
112
114
  end
@@ -120,7 +122,8 @@ module ActiveRecord
120
122
  calculate(:minimum, column_name)
121
123
  end
122
124
 
123
- # Same as <tt>#minimum</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
125
+ # Same as #minimum, but performs the query asynchronously and returns an
126
+ # ActiveRecord::Promise.
124
127
  def async_minimum(column_name)
125
128
  async.minimum(column_name)
126
129
  end
@@ -134,7 +137,8 @@ module ActiveRecord
134
137
  calculate(:maximum, column_name)
135
138
  end
136
139
 
137
- # Same as <tt>#maximum</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
140
+ # Same as #maximum, but performs the query asynchronously and returns an
141
+ # ActiveRecord::Promise.
138
142
  def async_maximum(column_name)
139
143
  async.maximum(column_name)
140
144
  end
@@ -152,7 +156,8 @@ module ActiveRecord
152
156
  end
153
157
  end
154
158
 
155
- # Same as <tt>#sum</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
159
+ # Same as #sum, but performs the query asynchronously and returns an
160
+ # ActiveRecord::Promise.
156
161
  def async_sum(identity_or_column = nil)
157
162
  async.sum(identity_or_column)
158
163
  end
@@ -287,7 +292,8 @@ module ActiveRecord
287
292
  end
288
293
  end
289
294
 
290
- # Same as <tt>#pluck</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
295
+ # Same as #pluck, but performs the query asynchronously and returns an
296
+ # ActiveRecord::Promise.
291
297
  def async_pluck(*column_names)
292
298
  async.pluck(*column_names)
293
299
  end
@@ -315,7 +321,8 @@ module ActiveRecord
315
321
  limit(1).pluck(*column_names).then(&:first)
316
322
  end
317
323
 
318
- # Same as <tt>#pick</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
324
+ # Same as #pick, but performs the query asynchronously and returns an
325
+ # ActiveRecord::Promise.
319
326
  def async_pick(*column_names)
320
327
  async.pick(*column_names)
321
328
  end
@@ -358,7 +365,8 @@ module ActiveRecord
358
365
  result.then { |result| type_cast_pluck_values(result, columns) }
359
366
  end
360
367
 
361
- # Same as <tt>#ids</tt> but perform the query asynchronously and returns an ActiveRecord::Promise.
368
+ # Same as #ids, but performs the query asynchronously and returns an
369
+ # ActiveRecord::Promise.
362
370
  def async_ids
363
371
  async.ids
364
372
  end
@@ -588,7 +588,7 @@ module ActiveRecord
588
588
  # User.order(Arel.sql('end_date - start_date'))
589
589
  # # SELECT "users".* FROM "users" ORDER BY end_date - start_date
590
590
  #
591
- # Custom query syntax, like JSON columns for Postgres, is supported in this way.
591
+ # Custom query syntax, like JSON columns for PostgreSQL, is supported in this way.
592
592
  #
593
593
  # User.order(Arel.sql("payload->>'kind'"))
594
594
  # # SELECT "users".* FROM "users" ORDER BY payload->>'kind'
@@ -30,7 +30,7 @@ module ActiveRecord
30
30
  #
31
31
  # ActiveRecord::Base.time_zone_aware_types = [:datetime]
32
32
  #
33
- # You can also add database specific timezone aware types. For example, for PostgreSQL:
33
+ # You can also add database-specific timezone aware types. For example, for PostgreSQL:
34
34
  #
35
35
  # ActiveRecord::Base.time_zone_aware_types += [:tsrange, :tstzrange]
36
36
  #
@@ -87,7 +87,7 @@ module ActiveRecord
87
87
  klass.connection.schema_cache.indexes(klass.table_name).any? do |index|
88
88
  index.unique &&
89
89
  index.where.nil? &&
90
- (index.columns - attributes).empty?
90
+ (Array(index.columns) - attributes).empty?
91
91
  end
92
92
  end
93
93
 
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: 7.1.0.rc2
4
+ version: 7.1.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: 2023-10-01 00:00:00.000000000 Z
11
+ date: 2023-10-11 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: 7.1.0.rc2
19
+ version: 7.1.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: 7.1.0.rc2
26
+ version: 7.1.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: 7.1.0.rc2
33
+ version: 7.1.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: 7.1.0.rc2
40
+ version: 7.1.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: timeout
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -469,10 +469,10 @@ licenses:
469
469
  - MIT
470
470
  metadata:
471
471
  bug_tracker_uri: https://github.com/rails/rails/issues
472
- changelog_uri: https://github.com/rails/rails/blob/v7.1.0.rc2/activerecord/CHANGELOG.md
473
- documentation_uri: https://api.rubyonrails.org/v7.1.0.rc2/
472
+ changelog_uri: https://github.com/rails/rails/blob/v7.1.1/activerecord/CHANGELOG.md
473
+ documentation_uri: https://api.rubyonrails.org/v7.1.1/
474
474
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
475
- source_code_uri: https://github.com/rails/rails/tree/v7.1.0.rc2/activerecord
475
+ source_code_uri: https://github.com/rails/rails/tree/v7.1.1/activerecord
476
476
  rubygems_mfa_required: 'true'
477
477
  post_install_message:
478
478
  rdoc_options:
@@ -487,9 +487,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
487
487
  version: 2.7.0
488
488
  required_rubygems_version: !ruby/object:Gem::Requirement
489
489
  requirements:
490
- - - ">"
490
+ - - ">="
491
491
  - !ruby/object:Gem::Version
492
- version: 1.3.1
492
+ version: '0'
493
493
  requirements: []
494
494
  rubygems_version: 3.4.18
495
495
  signing_key: