diff --git a/.tool-versions b/.tool-versions index 3f03c7a7..58766197 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -ruby 3.4.7 +ruby 3.4.8 diff --git a/closure_tree.gemspec b/closure_tree.gemspec index f449d87b..6bcc6b23 100644 --- a/closure_tree.gemspec +++ b/closure_tree.gemspec @@ -30,7 +30,7 @@ Gem::Specification.new do |gem| gem.add_dependency 'zeitwerk', '~> 2.7' gem.add_development_dependency 'database_cleaner' - gem.add_development_dependency 'minitest' + gem.add_development_dependency 'minitest', '~> 5.0' gem.add_development_dependency 'minitest-reporters' gem.add_development_dependency 'parallel' gem.add_development_dependency 'simplecov' diff --git a/lib/closure_tree/support.rb b/lib/closure_tree/support.rb index 4405b152..1c4814e5 100644 --- a/lib/closure_tree/support.rb +++ b/lib/closure_tree/support.rb @@ -42,7 +42,7 @@ def abstract_base_class klass = model_class while klass.superclass != ActiveRecord::Base parent = klass.superclass - # Stop at abstract class (ApplicationRecord, MysqlRecord, etc.) + # Stop at abstract class (ApplicationRecord, SecondaryRecord, etc.) return parent if parent.abstract_class? # Stop at connection boundary (handles non-abstract parents with custom connections) return parent if parent.connection_specification_name != parent.superclass.connection_specification_name diff --git a/test/closure_tree/adopt_test.rb b/test/closure_tree/adopt_test.rb index 0a2a5eeb..b61bf40c 100644 --- a/test/closure_tree/adopt_test.rb +++ b/test/closure_tree/adopt_test.rb @@ -255,7 +255,7 @@ def run_adopt_tests_for(model_class) run_adopt_tests_for(AdoptableTag) if postgresql?(ApplicationRecord.connection) # Test with MySQL -run_adopt_tests_for(MysqlAdoptableTag) if mysql?(MysqlRecord.connection) +run_adopt_tests_for(SecondaryAdoptableTag) if mysql?(SecondaryRecord.connection) # Test with SQLite -run_adopt_tests_for(MemoryAdoptableTag) if sqlite?(SqliteRecord.connection) +run_adopt_tests_for(MemoryAdoptableTag) if sqlite?(LiteRecord.connection) diff --git a/test/closure_tree/multi_database_test.rb b/test/closure_tree/multi_database_test.rb index 3883a5dc..daf191ca 100644 --- a/test/closure_tree/multi_database_test.rb +++ b/test/closure_tree/multi_database_test.rb @@ -6,27 +6,27 @@ class MultiDatabaseTest < ActiveSupport::TestCase def setup super # Create memory tables - always recreate for clean state - SqliteRecord.connection.create_table :memory_tags, force: true do |t| + LiteRecord.connection.create_table :memory_tags, force: true do |t| t.string :name t.integer :parent_id t.timestamps end - SqliteRecord.connection.create_table :memory_tag_hierarchies, id: false, force: true do |t| + LiteRecord.connection.create_table :memory_tag_hierarchies, id: false, force: true do |t| t.integer :ancestor_id, null: false t.integer :descendant_id, null: false t.integer :generations, null: false end - SqliteRecord.connection.add_index :memory_tag_hierarchies, %i[ancestor_id descendant_id generations], + LiteRecord.connection.add_index :memory_tag_hierarchies, %i[ancestor_id descendant_id generations], unique: true, name: 'memory_tag_anc_desc_idx' - SqliteRecord.connection.add_index :memory_tag_hierarchies, [:descendant_id], name: 'memory_tag_desc_idx' + LiteRecord.connection.add_index :memory_tag_hierarchies, [:descendant_id], name: 'memory_tag_desc_idx' end def teardown # Clean up SQLite tables after each test - SqliteRecord.connection.drop_table :memory_tag_hierarchies, if_exists: true - SqliteRecord.connection.drop_table :memory_tags, if_exists: true + LiteRecord.connection.drop_table :memory_tag_hierarchies, if_exists: true + LiteRecord.connection.drop_table :memory_tags, if_exists: true super end @@ -46,13 +46,13 @@ def test_postgresql_with_advisory_lock end def test_mysql_with_advisory_lock - skip 'MySQL not configured' unless mysql?(MysqlRecord.connection) + skip 'MySQL not configured' unless mysql?(SecondaryRecord.connection) - tag = MysqlTag.create!(name: 'MySQL Root') + tag = SecondaryTag.create!(name: 'MySQL Root') child = nil # Advisory locks should work on MySQL - MysqlTag.with_advisory_lock('test_lock') do + SecondaryTag.with_advisory_lock('test_lock') do child = tag.children.create!(name: 'MySQL Child') end @@ -80,21 +80,21 @@ def test_concurrent_operations_different_databases pg_tag.children.create!(name: 'PG Child 1') end - mysql_tag = MysqlTag.create!(name: 'MySQL Root') + mysql_tag = SecondaryTag.create!(name: 'MySQL Root') sqlite_tag = MemoryTag.create!(name: 'SQLite Root') # Test concurrent operations only for MySQL and SQLite threads = [] threads << Thread.new do - MysqlRecord.connection_pool.with_connection do - tag = MysqlTag.find(mysql_tag.id) + SecondaryRecord.connection_pool.with_connection do + tag = SecondaryTag.find(mysql_tag.id) tag.children.create!(name: 'MySQL Child 1') end end threads << Thread.new do - SqliteRecord.connection_pool.with_connection do + LiteRecord.connection_pool.with_connection do tag = MemoryTag.find(sqlite_tag.id) tag.children.create!(name: 'SQLite Child 1') end diff --git a/test/closure_tree/parallel_test.rb b/test/closure_tree/parallel_test.rb index 6faeeab0..6dc5cf99 100644 --- a/test/closure_tree/parallel_test.rb +++ b/test/closure_tree/parallel_test.rb @@ -67,9 +67,9 @@ def work # Clean up SQLite database file if it exists db_file = 'test/dummy/db/test.sqlite3' if File.exist?(db_file) - SqliteRecord.connection.disconnect! + LiteRecord.connection.disconnect! File.delete(db_file) - SqliteRecord.connection.reconnect! + LiteRecord.connection.reconnect! end Tag.delete_all Tag.hierarchy_class.delete_all diff --git a/test/dummy/app/models/lite_record.rb b/test/dummy/app/models/lite_record.rb new file mode 100644 index 00000000..3a4533e5 --- /dev/null +++ b/test/dummy/app/models/lite_record.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class LiteRecord < ApplicationRecord + self.abstract_class = true + connects_to database: { writing: :lite, reading: :lite } +end diff --git a/test/dummy/app/models/memory_adoptable_tag.rb b/test/dummy/app/models/memory_adoptable_tag.rb index 1dbcb4c6..7576e3ef 100644 --- a/test/dummy/app/models/memory_adoptable_tag.rb +++ b/test/dummy/app/models/memory_adoptable_tag.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -class MemoryAdoptableTag < SqliteRecord +class MemoryAdoptableTag < LiteRecord has_closure_tree dependent: :adopt, name_column: 'name' end diff --git a/test/dummy/app/models/memory_tag.rb b/test/dummy/app/models/memory_tag.rb index c8d39441..8863898b 100644 --- a/test/dummy/app/models/memory_tag.rb +++ b/test/dummy/app/models/memory_tag.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -class MemoryTag < SqliteRecord +class MemoryTag < LiteRecord has_closure_tree end diff --git a/test/dummy/app/models/mysql_adoptable_tag.rb b/test/dummy/app/models/secondary_adoptable_tag.rb similarity index 66% rename from test/dummy/app/models/mysql_adoptable_tag.rb rename to test/dummy/app/models/secondary_adoptable_tag.rb index b63399c7..56c23528 100644 --- a/test/dummy/app/models/mysql_adoptable_tag.rb +++ b/test/dummy/app/models/secondary_adoptable_tag.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -class MysqlAdoptableTag < MysqlRecord +class SecondaryAdoptableTag < SecondaryRecord has_closure_tree dependent: :adopt, name_column: 'name' end diff --git a/test/dummy/app/models/mysql_record.rb b/test/dummy/app/models/secondary_record.rb similarity index 76% rename from test/dummy/app/models/mysql_record.rb rename to test/dummy/app/models/secondary_record.rb index 152df7c0..422917a7 100644 --- a/test/dummy/app/models/mysql_record.rb +++ b/test/dummy/app/models/secondary_record.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class MysqlRecord < ApplicationRecord +class SecondaryRecord < ApplicationRecord self.abstract_class = true connects_to database: { writing: :secondary, reading: :secondary } end diff --git a/test/dummy/app/models/mysql_tag.rb b/test/dummy/app/models/secondary_tag.rb similarity index 59% rename from test/dummy/app/models/mysql_tag.rb rename to test/dummy/app/models/secondary_tag.rb index a38ebf37..1cd9eece 100644 --- a/test/dummy/app/models/mysql_tag.rb +++ b/test/dummy/app/models/secondary_tag.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -class MysqlTag < MysqlRecord +class SecondaryTag < SecondaryRecord has_closure_tree end diff --git a/test/dummy/app/models/sqlite_record.rb b/test/dummy/app/models/sqlite_record.rb deleted file mode 100644 index b508a71f..00000000 --- a/test/dummy/app/models/sqlite_record.rb +++ /dev/null @@ -1,6 +0,0 @@ -# frozen_string_literal: true - -class SqliteRecord < ApplicationRecord - self.abstract_class = true - connects_to database: { writing: :sqlite, reading: :sqlite } -end diff --git a/test/dummy/config/database.yml b/test/dummy/config/database.yml index ce2725a8..8c31e131 100644 --- a/test/dummy/config/database.yml +++ b/test/dummy/config/database.yml @@ -11,7 +11,7 @@ test: url: "<%= ENV['DATABASE_URL_MYSQL'] || 'mysql2://closure_tree:closure_tree_pass@127.0.0.1:3367/closure_tree_test' %>" properties: allowPublicKeyRetrieval: true - sqlite: + lite: <<: *default adapter: sqlite3 database: "test/dummy/db/test.sqlite3" \ No newline at end of file diff --git a/test/dummy/db/mysql_schema.rb b/test/dummy/db/mysql_schema.rb deleted file mode 100644 index a887b1a1..00000000 --- a/test/dummy/db/mysql_schema.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -ActiveRecord::Schema.define(version: 1) do - create_table 'mysql_tags', force: true do |t| - t.string 'name' - end - - create_table 'mysql_tag_audits', id: false, force: true do |t| - t.string 'tag_name' - end - - create_table 'mysql_labels', id: false, force: true do |t| - t.string 'name' - end -end diff --git a/test/dummy/db/schema.rb b/test/dummy/db/schema.rb index 3bcd58d0..0602b1f3 100644 --- a/test/dummy/db/schema.rb +++ b/test/dummy/db/schema.rb @@ -170,37 +170,37 @@ add_foreign_key(:tag_hierarchies, :tags, column: 'descendant_id', on_delete: :cascade) # Multi-database test models - create_table 'mysql_tags' do |t| + create_table 'secondary_tags' do |t| t.string 'name' t.references 'parent' t.timestamps null: false end - create_table 'mysql_tag_hierarchies', id: false do |t| + create_table 'secondary_tag_hierarchies', id: false do |t| t.references 'ancestor', null: false t.references 'descendant', null: false t.integer 'generations', null: false end - add_index 'mysql_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, - name: 'mysql_tag_anc_desc_idx' - add_index 'mysql_tag_hierarchies', [:descendant_id], name: 'mysql_tag_desc_idx' + add_index 'secondary_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, + name: 'secondary_tag_anc_desc_idx' + add_index 'secondary_tag_hierarchies', [:descendant_id], name: 'secondary_tag_desc_idx' - create_table 'sqlite_tags' do |t| + create_table 'lite_tags' do |t| t.string 'name' t.references 'parent' t.timestamps null: false end - create_table 'sqlite_tag_hierarchies', id: false do |t| + create_table 'lite_tag_hierarchies', id: false do |t| t.references 'ancestor', null: false t.references 'descendant', null: false t.integer 'generations', null: false end - add_index 'sqlite_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, - name: 'sqlite_tag_anc_desc_idx' - add_index 'sqlite_tag_hierarchies', [:descendant_id], name: 'sqlite_tag_desc_idx' + add_index 'lite_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, + name: 'lite_tag_anc_desc_idx' + add_index 'lite_tag_hierarchies', [:descendant_id], name: 'lite_tag_desc_idx' create_table 'scoped_items' do |t| t.string 'name' @@ -237,21 +237,21 @@ name: 'adoptable_tag_anc_desc_idx' add_index 'adoptable_tag_hierarchies', [:descendant_id], name: 'adoptable_tag_desc_idx' - create_table 'mysql_adoptable_tags' do |t| + create_table 'secondary_adoptable_tags' do |t| t.string 'name' t.references 'parent' t.timestamps null: false end - create_table 'mysql_adoptable_tag_hierarchies', id: false do |t| + create_table 'secondary_adoptable_tag_hierarchies', id: false do |t| t.references 'ancestor', null: false t.references 'descendant', null: false t.integer 'generations', null: false end - add_index 'mysql_adoptable_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, - name: 'mysql_adoptable_tag_anc_desc_idx' - add_index 'mysql_adoptable_tag_hierarchies', [:descendant_id], name: 'mysql_adoptable_tag_desc_idx' + add_index 'secondary_adoptable_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, + name: 'secondary_adoptable_tag_anc_desc_idx' + add_index 'secondary_adoptable_tag_hierarchies', [:descendant_id], name: 'secondary_adoptable_tag_desc_idx' create_table 'memory_adoptable_tags' do |t| t.string 'name' diff --git a/test/dummy/db/secondary_schema.rb b/test/dummy/db/secondary_schema.rb index 084bc481..f35d629f 100644 --- a/test/dummy/db/secondary_schema.rb +++ b/test/dummy/db/secondary_schema.rb @@ -13,37 +13,37 @@ # It's strongly recommended that you check this file into your version control system. ActiveRecord::Schema.define(version: 0) do - create_table 'mysql_tags', force: true do |t| + create_table 'secondary_tags', force: true do |t| t.string 'name' t.integer 'parent_id' t.datetime 'created_at' t.datetime 'updated_at' end - create_table 'mysql_tag_hierarchies', id: false, force: true do |t| + create_table 'secondary_tag_hierarchies', id: false, force: true do |t| t.integer 'ancestor_id', null: false t.integer 'descendant_id', null: false t.integer 'generations', null: false end - add_index 'mysql_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, - name: 'mysql_tag_anc_des_idx' - add_index 'mysql_tag_hierarchies', [:descendant_id], name: 'mysql_tag_desc_idx' + add_index 'secondary_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, + name: 'secondary_tag_anc_des_idx' + add_index 'secondary_tag_hierarchies', [:descendant_id], name: 'secondary_tag_desc_idx' - create_table 'mysql_adoptable_tags', force: true do |t| + create_table 'secondary_adoptable_tags', force: true do |t| t.string 'name' t.integer 'parent_id' t.datetime 'created_at' t.datetime 'updated_at' end - create_table 'mysql_adoptable_tag_hierarchies', id: false, force: true do |t| + create_table 'secondary_adoptable_tag_hierarchies', id: false, force: true do |t| t.integer 'ancestor_id', null: false t.integer 'descendant_id', null: false t.integer 'generations', null: false end - add_index 'mysql_adoptable_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, - name: 'mysql_adoptable_tag_anc_desc_idx' - add_index 'mysql_adoptable_tag_hierarchies', [:descendant_id], name: 'mysql_adoptable_tag_desc_idx' + add_index 'secondary_adoptable_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, + name: 'secondary_adoptable_tag_anc_desc_idx' + add_index 'secondary_adoptable_tag_hierarchies', [:descendant_id], name: 'secondary_adoptable_tag_desc_idx' end diff --git a/test/dummy/db/sqlite_schema.rb b/test/dummy/db/sqlite_schema.rb index 1f0e85fb..30e0fd0e 100644 --- a/test/dummy/db/sqlite_schema.rb +++ b/test/dummy/db/sqlite_schema.rb @@ -13,22 +13,22 @@ # It's strongly recommended that you check this file into your version control system. ActiveRecord::Schema.define(version: 0) do - create_table 'sqlite_tags', force: true do |t| + create_table 'lite_tags', force: true do |t| t.string 'name' t.integer 'parent_id' t.datetime 'created_at' t.datetime 'updated_at' end - create_table 'sqlite_tag_hierarchies', id: false, force: true do |t| + create_table 'lite_tag_hierarchies', id: false, force: true do |t| t.integer 'ancestor_id', null: false t.integer 'descendant_id', null: false t.integer 'generations', null: false end - add_index 'sqlite_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, - name: 'sqlite_tag_anc_desc_idx' - add_index 'sqlite_tag_hierarchies', [:descendant_id], name: 'sqlite_tag_desc_idx' + add_index 'lite_tag_hierarchies', %i[ancestor_id descendant_id generations], unique: true, + name: 'lite_tag_anc_desc_idx' + add_index 'lite_tag_hierarchies', [:descendant_id], name: 'lite_tag_desc_idx' create_table 'memory_adoptable_tags', force: true do |t| t.string 'name' diff --git a/test/test_helper.rb b/test/test_helper.rb index 0b0d022f..709de9a1 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -36,8 +36,8 @@ def self.startup setup do # Configure DatabaseCleaner for each database connection DatabaseCleaner[:active_record, db: ApplicationRecord].strategy = :truncation - DatabaseCleaner[:active_record, db: MysqlRecord].strategy = :truncation - DatabaseCleaner[:active_record, db: SqliteRecord].strategy = :truncation + DatabaseCleaner[:active_record, db: SecondaryRecord].strategy = :truncation + DatabaseCleaner[:active_record, db: LiteRecord].strategy = :truncation DatabaseCleaner.start end