activerecord-sqlserver-adapter 8.1.3 → 8.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b233f0d16ac6cda7cd510614f1c9262f7362fa9a19ccdfc20664c36bcee6852a
4
- data.tar.gz: 9929d4e6e483b4594969333727fdfabacf379bd59b57f9a336673a1f1a04a057
3
+ metadata.gz: b449fb9569a0dcfc91cc7e0109a29a145dc0c11b8488a3eb486650fa037eb2ad
4
+ data.tar.gz: ca39fe0127a4ab8e507b49c5a49f59ae02f193d6d54ae3f0d2e9f7731c6f4b08
5
5
  SHA512:
6
- metadata.gz: 715cf25b356956e018c9ff202583b77c48e50d8946d0eef5b2b4a4dc75d1fea206a2ce5db78109722c6eda000d24cb222d6abd25cf3b630885236d76a83c623b
7
- data.tar.gz: 139afbfa982ca4ae21be4458ea3b1666803750810443a754099a01f9479acc83c35bd0aa4ede17e7416cf0702d0417714f02fdeae5da09aebddf873061d4ff77
6
+ metadata.gz: d5a25f54332ba7e594ceef724da573ef3add3820e7f7de4dcc3a59622c77b5a5978a433efa42894f9467d8940024e11345022d556522a2000289a5f2046cd012
7
+ data.tar.gz: ed563ea7651fb586b42c3d59f17d8459b73245ebf014b9121a85baff1584a405a4ec72e8a1a005cbf57c9e0fa84f8a5c8ad4b20c3d451a5490e58b19f34af394
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## v8.1.4
2
+
3
+ #### Fixed
4
+
5
+ - [#1418](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1418) Fix `change_column_null` to re-declare datetime2 columns correctly.
6
+
7
+ #### Changed
8
+
9
+ - [#1405](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1405) Fix `insert_all`/`upsert_all` for single character, temporary, non-ASCII and three part table names, and stop an aliased target being included in the `MERGE` table name.
10
+
1
11
  ## v8.1.3
2
12
 
3
13
  #### Added
data/Gemfile CHANGED
@@ -62,7 +62,6 @@ end
62
62
 
63
63
  group :development do
64
64
  gem "minitest-spec-rails"
65
- gem "mocha"
66
65
  gem "pry-byebug", platform: [:mri, :mingw, :x64_mingw]
67
66
  end
68
67
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 8.1.3
1
+ 8.1.4
@@ -4,6 +4,9 @@ module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  module SQLServer
6
6
  module SchemaStatements
7
+ MERGE_TARGET_IDENTIFIER = /(?:\[[^\]]+\]|[a-z0-9_-]+)/i # :nodoc:
8
+ MERGE_TARGET_TABLE_NAME = /\A\s*MERGE\s+INTO\s+(#{MERGE_TARGET_IDENTIFIER}(?:\s*\.#{MERGE_TARGET_IDENTIFIER}){0,2})\s+(?:AS|WITH|USING)/i # :nodoc:
9
+
7
10
  def create_table(table_name, **options)
8
11
  res = super
9
12
  clear_cache!
@@ -411,7 +414,12 @@ module ActiveRecord
411
414
  if !null.nil? && null == false && !default.nil?
412
415
  execute("UPDATE #{table_id} SET #{column_id}=#{quote(default)} WHERE #{column_id} IS NULL")
413
416
  end
414
- sql = "ALTER TABLE #{table_id} ALTER COLUMN #{column_id} #{type_to_sql column.type, limit: column.limit, precision: column.precision, scale: column.scale}"
417
+
418
+ # If datetime column has precision then it should be datetime2 column.
419
+ column_type = column.type
420
+ column_type = :datetime2 if column.type.to_s == "datetime" && !column.precision.nil?
421
+
422
+ sql = "ALTER TABLE #{table_id} ALTER COLUMN #{column_id} #{type_to_sql column_type, limit: column.limit, precision: column.precision, scale: column.scale}"
415
423
  sql += " NOT NULL" if !null.nil? && null == false
416
424
 
417
425
  execute sql
@@ -726,7 +734,7 @@ module ActiveRecord
726
734
  elsif s.match?(/^\s*UPDATE\s+.*/i)
727
735
  s.match(/UPDATE\s+([^(\s]+)\s*/i)[1]
728
736
  elsif s.match?(/^\s*MERGE INTO.*/i)
729
- s.match(/^\s*MERGE\s+INTO\s+(\[?[a-z0-9_ -]+\]?\.?\[?[a-z0-9_ -]+\]?)\s+(AS|WITH|USING)/i)[1]
737
+ s.match(MERGE_TARGET_TABLE_NAME)[1]
730
738
  else
731
739
  s.match(/FROM[\s|(]+((\[[^(\]]+\])|[^(\s]+)\s*/i)[1]
732
740
  end.strip
@@ -230,6 +230,7 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
230
230
  @identity_merge_sql = "MERGE INTO [ships] WITH (UPDLOCK, HOLDLOCK) AS target USING ( SELECT * FROM ( SELECT [id], [name], ROW_NUMBER() OVER ( PARTITION BY [id] ORDER BY [id] DESC ) AS rn_0 FROM ( VALUES (101, N'RSS Sir David Attenborough') ) AS t1 ([id], [name]) ) AS ranked_source WHERE rn_0 = 1 ) AS source ON (target.[id] = source.[id]) WHEN MATCHED THEN UPDATE SET target.[name] = source.[name] WHEN NOT MATCHED BY TARGET THEN INSERT ([id], [name]) VALUES (source.[id], source.[name]) OUTPUT INSERTED.[id]"
231
231
  @identity_merge_sql_unquoted = "MERGE INTO ships WITH (UPDLOCK, HOLDLOCK) AS target USING ( SELECT * FROM ( SELECT id, name, ROW_NUMBER() OVER ( PARTITION BY id ORDER BY id DESC ) AS rn_0 FROM ( VALUES (101, N'RSS Sir David Attenborough') ) AS t1 (id, name) ) AS ranked_source WHERE rn_0 = 1 ) AS source ON (target.id = source.id) WHEN MATCHED THEN UPDATE SET target.name = source.name WHEN NOT MATCHED BY TARGET THEN INSERT (id, name) VALUES (source.id, source.name) OUTPUT INSERTED.id"
232
232
  @identity_merge_sql_unordered = "MERGE INTO [ships] WITH (UPDLOCK, HOLDLOCK) AS target USING ( SELECT * FROM ( SELECT [name], [id], ROW_NUMBER() OVER ( PARTITION BY [id] ORDER BY [id] DESC ) AS rn_0 FROM ( VALUES (101, N'RSS Sir David Attenborough') ) AS t1 ([name], [id]) ) AS ranked_source WHERE rn_0 = 1 ) AS source ON (target.[id] = source.[id]) WHEN MATCHED THEN UPDATE SET target.[name] = source.[name] WHEN NOT MATCHED BY TARGET THEN INSERT ([name], [id]) VALUES (source.[name], source.[id]) OUTPUT INSERTED.[id]"
233
+ @identity_merge_sql_aliased_target = @identity_merge_sql.sub(" WITH (UPDLOCK, HOLDLOCK)", "")
233
234
 
234
235
  @identity_insert_sql_non_dbo = "INSERT INTO [test].[aliens] ([id],[name]) VALUES(420,'Mork')"
235
236
  @identity_insert_sql_non_dbo_unquoted = "INSERT INTO test.aliens ([id],[name]) VALUES(420,'Mork')"
@@ -253,6 +254,7 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
253
254
  assert_equal "[ships]", connection.send(:query_requires_identity_insert?, @identity_merge_sql)
254
255
  assert_equal "[ships]", connection.send(:query_requires_identity_insert?, @identity_merge_sql_unquoted)
255
256
  assert_equal "[ships]", connection.send(:query_requires_identity_insert?, @identity_merge_sql_unordered)
257
+ assert_equal "[ships]", connection.send(:query_requires_identity_insert?, @identity_merge_sql_aliased_target)
256
258
 
257
259
  assert_equal "[test].[aliens]", connection.send(:query_requires_identity_insert?, @identity_insert_sql_non_dbo)
258
260
  assert_equal "[test].[aliens]", connection.send(:query_requires_identity_insert?, @identity_insert_sql_non_dbo_unquoted)
@@ -2,29 +2,31 @@
2
2
 
3
3
  require "cases/helper_sqlserver"
4
4
  require "migrations/create_clients_and_change_column_null"
5
+ require "cases/migration/helper"
5
6
 
6
7
  class ChangeColumnNullTestSqlServer < ActiveRecord::TestCase
7
- before do
8
- @old_verbose = ActiveRecord::Migration.verbose
9
- ActiveRecord::Migration.verbose = false
10
- CreateClientsAndChangeColumnNull.new.up
11
- end
8
+ include ::ActiveRecord::Migration::TestHelper
12
9
 
13
- after do
14
- CreateClientsAndChangeColumnNull.new.down
15
- ActiveRecord::Migration.verbose = @old_verbose
10
+ def find_column(table, column_name)
11
+ connection.columns(table).find { |column| column.name == column_name.to_s }
16
12
  end
17
13
 
18
- def find_column(table, name)
19
- table.find { |column| column.name == name }
20
- end
14
+ describe "using migration" do
15
+ before do
16
+ @old_verbose = ActiveRecord::Migration.verbose
17
+ ActiveRecord::Migration.verbose = false
18
+ CreateClientsAndChangeColumnNull.new.up
19
+ end
20
+
21
+ after do
22
+ CreateClientsAndChangeColumnNull.new.down
23
+ ActiveRecord::Migration.verbose = @old_verbose
24
+ end
21
25
 
22
- let(:clients_table) { connection.columns("clients") }
23
- let(:name_column) { find_column(clients_table, "name") }
24
- let(:code_column) { find_column(clients_table, "code") }
25
- let(:value_column) { find_column(clients_table, "value") }
26
+ let(:name_column) { find_column("clients", "name") }
27
+ let(:code_column) { find_column("clients", "code") }
28
+ let(:value_column) { find_column("clients", "value") }
26
29
 
27
- describe "#change_column_null" do
28
30
  it "does not change the column limit" do
29
31
  _(name_column.limit).must_equal 15
30
32
  end
@@ -41,4 +43,32 @@ class ChangeColumnNullTestSqlServer < ActiveRecord::TestCase
41
43
  _(value_column.scale).must_equal 8
42
44
  end
43
45
  end
46
+
47
+ it "datetime2 column" do
48
+ add_column :test_models, :expiry_date, :datetime, precision: 6, null: true
49
+
50
+ _(find_column(:test_models, :expiry_date).sql_type).must_equal "datetime2(6)"
51
+ _(find_column(:test_models, :expiry_date).null).must_equal true
52
+
53
+ connection.change_column_null(:test_models, :expiry_date, false)
54
+
55
+ _(find_column(:test_models, :expiry_date).sql_type).must_equal "datetime2(6)"
56
+ _(find_column(:test_models, :expiry_date).null).must_equal false
57
+ ensure
58
+ remove_column("test_models", "expiry_date")
59
+ end
60
+
61
+ it "datetime column" do
62
+ add_column :test_models, :expiry_date, :datetime, precision: nil, null: true
63
+
64
+ _(find_column(:test_models, :expiry_date).sql_type).must_equal "datetime"
65
+ _(find_column(:test_models, :expiry_date).null).must_equal true
66
+
67
+ connection.change_column_null(:test_models, :expiry_date, false)
68
+
69
+ _(find_column(:test_models, :expiry_date).sql_type).must_equal "datetime"
70
+ _(find_column(:test_models, :expiry_date).null).must_equal false
71
+ ensure
72
+ remove_column("test_models", "expiry_date")
73
+ end
44
74
  end
@@ -77,6 +77,26 @@ class UniquenessValidationWithIndexTest < ActiveRecord::TestCase
77
77
  end
78
78
  end
79
79
 
80
+ module ActiveRecord
81
+ class Migration::IndexTest < ActiveRecord::TestCase
82
+ # SQL Server requires an explicit truthy comparison for BIT columns.
83
+ coerce_tests! :test_rename_index_preserves_where_clause
84
+ def test_rename_index_preserves_where_clause_coerced
85
+ skip unless connection.supports_partial_index?
86
+
87
+ # Keep the names short to make Oracle and similar behave.
88
+ connection.add_index(table_name, [:foo], name: "old_idx", where: "administrator = 1")
89
+ old_where = connection.indexes(table_name).find { |i| i.name == "old_idx" }.where
90
+
91
+ connection.rename_index(table_name, "old_idx", "new_idx")
92
+
93
+ new_index = connection.indexes(table_name).find { |i| i.name == "new_idx" }
94
+ assert_not_nil new_index
95
+ assert_equal old_where, new_index.where
96
+ end
97
+ end
98
+ end
99
+
80
100
  module ActiveRecord
81
101
  class AdapterTest < ActiveRecord::TestCase
82
102
  # Legacy binds are not supported.
@@ -163,7 +183,7 @@ module ActiveRecord
163
183
  # SQL Server does not allow truncation of tables that are referenced by foreign key
164
184
  # constraints. So manually remove/add foreign keys in test.
165
185
  coerce_tests! :test_truncate_tables_with_query_cache
166
- def test_truncate_tables_with_query_cache
186
+ def test_truncate_tables_with_query_cache_coerced
167
187
  # Remove foreign key constraint to allow truncation.
168
188
  @connection.remove_foreign_key :authors, :author_addresses
169
189
 
@@ -518,8 +538,8 @@ module ActiveRecord
518
538
  five = columns.detect { |c| c.name == "five" }
519
539
 
520
540
  assert_equal "hello", one.default
521
- assert_equal true, two.fetch_cast_type(connection).deserialize(two.default)
522
- assert_equal false, three.fetch_cast_type(connection).deserialize(three.default)
541
+ assert_equal true, two.cast_type.deserialize(two.default)
542
+ assert_equal false, three.cast_type.deserialize(three.default)
523
543
  assert_equal 1, four.default
524
544
  assert_equal "hello", five.default
525
545
  end
@@ -2053,7 +2073,6 @@ class UnsafeRawSqlTest < ActiveRecord::TestCase
2053
2073
  test "order: allows nested functions" do
2054
2074
  ids_expected = Post.order(Arel.sql("author_id, len(trim(title))")).pluck(:id)
2055
2075
 
2056
- # $DEBUG = true
2057
2076
  ids = Post.order("author_id, len(trim(title))").pluck(:id)
2058
2077
 
2059
2078
  assert_equal ids_expected, ids
@@ -2442,6 +2461,50 @@ class FieldOrderedValuesTest < ActiveRecord::TestCase
2442
2461
  Book.where(author_id: nil, name: nil).delete_all
2443
2462
  Book.lease_connection.add_index(:books, [:author_id, :name], unique: true)
2444
2463
  end
2464
+
2465
+ # Need to remove index as SQL Server considers NULLs on a unique-index to be equal unlike PostgreSQL/MySQL/SQLite.
2466
+ coerce_tests! :test_in_order_of_with_out_of_bound_integer_does_not_match_nulls
2467
+ def test_in_order_of_with_out_of_bound_integer_does_not_match_nulls_coerced
2468
+ Book.lease_connection.remove_index(:books, column: [:author_id, :name])
2469
+
2470
+ original_test_in_order_of_with_out_of_bound_integer_does_not_match_nulls
2471
+ ensure
2472
+ Book.where(author_id: nil, name: nil).delete_all
2473
+ Book.lease_connection.add_index(:books, [:author_id, :name], unique: true)
2474
+ end
2475
+
2476
+ # Need to remove index as SQL Server considers NULLs on a unique-index to be equal unlike PostgreSQL/MySQL/SQLite.
2477
+ coerce_tests! :test_in_order_of_with_only_unrepresentable_values_does_not_build_empty_case
2478
+ def test_in_order_of_with_only_unrepresentable_values_does_not_build_empty_case_coerced
2479
+ Book.lease_connection.remove_index(:books, column: [:author_id, :name])
2480
+
2481
+ original_test_in_order_of_with_only_unrepresentable_values_does_not_build_empty_case
2482
+ ensure
2483
+ Book.where(author_id: nil, name: nil).delete_all
2484
+ Book.lease_connection.add_index(:books, [:author_id, :name], unique: true)
2485
+ end
2486
+
2487
+ # Need to remove index as SQL Server considers NULLs on a unique-index to be equal unlike PostgreSQL/MySQL/SQLite.
2488
+ coerce_tests! :test_in_order_of_with_unknown_enum_key_does_not_match_nulls
2489
+ def test_in_order_of_with_unknown_enum_key_does_not_match_nulls_coerced
2490
+ Book.lease_connection.remove_index(:books, column: [:author_id, :name])
2491
+
2492
+ original_test_in_order_of_with_unknown_enum_key_does_not_match_nulls
2493
+ ensure
2494
+ Book.where(author_id: nil, name: nil).delete_all
2495
+ Book.lease_connection.add_index(:books, [:author_id, :name], unique: true)
2496
+ end
2497
+
2498
+ # Need to remove index as SQL Server considers NULLs on a unique-index to be equal unlike PostgreSQL/MySQL/SQLite.
2499
+ coerce_tests! :test_in_order_of_with_column_from_cte
2500
+ def test_in_order_of_with_column_from_cte_coerced
2501
+ connection.remove_index(:books, column: [:author_id, :name])
2502
+
2503
+ original_test_in_order_of_with_column_from_cte
2504
+ ensure
2505
+ Book.where(author_id: nil, name: nil).delete_all
2506
+ Book.lease_connection.add_index(:books, [:author_id, :name], unique: true)
2507
+ end
2445
2508
  end
2446
2509
 
2447
2510
  class QueryLogsTest < ActiveRecord::TestCase
@@ -2837,3 +2900,13 @@ class EachTest < ActiveRecord::TestCase
2837
2900
  end
2838
2901
  end
2839
2902
  end
2903
+
2904
+ class ActiveRecord::Encryption::EncryptableFixtureTest < ActiveRecord::EncryptionTestCase
2905
+ # Set the attribute as JSON type.
2906
+ ::EncryptedBookWithJson.attribute :metadata, ActiveRecord::Type::SQLServer::Json.new
2907
+
2908
+ coerce_tests! %r{fixtures for json columns get encrypted automatically}
2909
+ def fixtures_for_json_columns_get_encrypted_automatically
2910
+ send(:"original_fixtures for json columns get encrypted automatically")
2911
+ end
2912
+ end
@@ -4,13 +4,11 @@ class DbConsole < ActiveRecord::TestCase
4
4
  subject { ActiveRecord::ConnectionAdapters::SQLServerAdapter }
5
5
 
6
6
  it "uses sqlcmd to connect to database" do
7
- subject.expects(:find_cmd_and_exec).with("sqlcmd", "-d", "db", "-U", "user", "-P", "secret", "-C", "-S",
8
- "tcp:localhost,1433")
7
+ assert_called_with(subject, :find_cmd_and_exec, ["sqlcmd", "-d", "db", "-U", "user", "-P", "secret", "-C", "-S", "tcp:localhost,1433"]) do
8
+ config = make_db_config(adapter: "sqlserver", database: "db", username: "user", password: "secret", host: "localhost", port: 1433, trust_server_certificate: true)
9
9
 
10
- config = make_db_config(adapter: "sqlserver", database: "db", username: "user", password: "secret",
11
- host: "localhost", port: 1433, trust_server_certificate: true)
12
-
13
- subject.dbconsole(config)
10
+ subject.dbconsole(config)
11
+ end
14
12
  end
15
13
 
16
14
  private
@@ -14,7 +14,6 @@ require "support/load_schema_sqlserver"
14
14
  require "support/coerceable_test_sqlserver"
15
15
  require "support/connection_reflection"
16
16
  require "support/query_assertions"
17
- require "mocha/minitest"
18
17
 
19
18
  Minitest.after_run do
20
19
  puts "\n\n"
@@ -122,6 +122,38 @@ class SchemaTestSQLServer < ActiveRecord::TestCase
122
122
  it do
123
123
  assert_equal "[with_numbers_1234]", connection.send(:get_raw_table_name, "MERGE INTO [with_numbers_1234] AS target")
124
124
  end
125
+
126
+ it do
127
+ assert_equal "[dashboards]", connection.send(:get_raw_table_name, "MERGE INTO [dashboards] AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
128
+ end
129
+
130
+ it do
131
+ assert_equal "lock_without_defaults", connection.send(:get_raw_table_name, "MERGE INTO lock_without_defaults AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
132
+ end
133
+
134
+ it do
135
+ assert_equal "[WITH - SPACES]", connection.send(:get_raw_table_name, "MERGE INTO [WITH - SPACES] AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
136
+ end
137
+
138
+ it do
139
+ assert_equal "[with].[select notation]", connection.send(:get_raw_table_name, "MERGE INTO [with].[select notation] AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
140
+ end
141
+
142
+ it do
143
+ assert_equal "[x]", connection.send(:get_raw_table_name, "MERGE INTO [x] WITH (UPDLOCK, HOLDLOCK) AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
144
+ end
145
+
146
+ it do
147
+ assert_equal "[with].[select notation]", connection.send(:get_raw_table_name, "MERGE INTO [with].[select notation] WITH (UPDLOCK, HOLDLOCK) AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
148
+ end
149
+
150
+ it do
151
+ assert_equal "[a].[dbo].[dashboards]", connection.send(:get_raw_table_name, "MERGE INTO [a].[dbo].[dashboards] WITH (UPDLOCK, HOLDLOCK) AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
152
+ end
153
+
154
+ it do
155
+ assert_equal "with .dashboards", connection.send(:get_raw_table_name, "MERGE INTO with .dashboards WITH (UPDLOCK, HOLDLOCK) AS target USING (VALUES (1)) AS source ([id]) ON (target.[id] = source.[id]) WHEN NOT MATCHED THEN INSERT ([id]) VALUES (source.[id]);")
156
+ end
125
157
  end
126
158
 
127
159
  describe "CREATE VIEW statements" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-sqlserver-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.1.3
4
+ version: 8.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ken Collins
@@ -245,8 +245,8 @@ licenses:
245
245
  - MIT
246
246
  metadata:
247
247
  bug_tracker_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/issues
248
- changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v8.1.3/CHANGELOG.md
249
- source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v8.1.3
248
+ changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v8.1.4/CHANGELOG.md
249
+ source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v8.1.4
250
250
  rdoc_options: []
251
251
  require_paths:
252
252
  - lib
@@ -261,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
261
  - !ruby/object:Gem::Version
262
262
  version: '0'
263
263
  requirements: []
264
- rubygems_version: 3.6.7
264
+ rubygems_version: 4.0.16
265
265
  specification_version: 4
266
266
  summary: ActiveRecord SQL Server Adapter.
267
267
  test_files: []