From 07617675ecaf54a58043ff347eacdb518873a6db Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:27:42 +0000 Subject: [PATCH 01/15] Initial plan From caca7d8bbbafe62a850c5515f215adb47913b276 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:33:08 +0000 Subject: [PATCH 02/15] Add database filtering support for multi-database compatibility Co-authored-by: ka8725 <243846+ka8725@users.noreply.github.com> --- .gitignore | 1 + README.md | 73 +++++++++ lib/actual_db_schema/configuration.rb | 11 +- lib/actual_db_schema/migration_context.rb | 27 +++- test/test_database_filtering.rb | 186 ++++++++++++++++++++++ 5 files changed, 291 insertions(+), 7 deletions(-) create mode 100644 test/test_database_filtering.rb diff --git a/.gitignore b/.gitignore index 8a3691e..6d1be0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /.bundle/ +/vendor/bundle/ /.yardoc /_yardoc/ /coverage/ diff --git a/README.md b/README.md index 3b90010..44caada 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,79 @@ This task will prompt you to choose one of the three options: Based on your selection, a post-checkout hook will be installed or updated in your `.git/hooks` folder. +## Excluding Databases from Processing + +**For Rails 6.1+ applications using multiple databases** (especially with infrastructure databases like Solid Queue, Solid Cable, or Solid Cache), you can exclude specific databases from ActualDbSchema's processing to prevent connection conflicts. + +### Why You Might Need This + +Modern Rails applications often use the `connects_to` pattern for infrastructure databases. These databases maintain their own isolated connection pools, and ActualDbSchema's global connection switching can interfere with active queries. This is particularly common with: + +- **Solid Queue** (Rails 8 default job backend) +- **Solid Cable** (WebSocket connections) +- **Solid Cache** (caching infrastructure) +- Any database marked with `database_tasks: false` + +### Method 1: Using `database_tasks: false` in `database.yml` + +ActualDbSchema automatically respects Rails' `database_tasks: false` setting. Add this to your infrastructure databases: + +```yaml +# config/database.yml +development: + primary: + adapter: mysql2 + database: my_app_development + queue: + adapter: mysql2 + database: my_app_queue + database_tasks: false # ActualDbSchema will skip this database + migrations_paths: db/queue_migrate +``` + +### Method 2: Using `excluded_databases` Configuration + +Explicitly exclude databases by name in your initializer: + +```ruby +# config/initializers/actual_db_schema.rb +ActualDbSchema.configure do |config| + config.excluded_databases = [:queue, :cable, :cache] +end +``` + +### Method 3: Using Environment Variable + +Set the environment variable `ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES` with a comma-separated list: + +```sh +export ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES="queue,cable,cache" +``` + +### Combined Approach + +Both `database_tasks: false` and `excluded_databases` work together. A database will be skipped if it matches either criterion: + +```yaml +# config/database.yml +development: + queue: + database_tasks: false # Excluded via database.yml + cable: + adapter: mysql2 + database: my_app_cable + # Not marked as database_tasks: false, but can be excluded via config +``` + +```ruby +# config/initializers/actual_db_schema.rb +ActualDbSchema.configure do |config| + config.excluded_databases = [:cable] # Explicitly exclude cable +end +``` + +In this example, both `queue` and `cable` databases will be excluded from ActualDbSchema processing. + ## Multi-Tenancy Support If your application leverages multiple schemas for multi-tenancy — such as those implemented by the [apartment](https://github.com/influitive/apartment) gem or similar solutions — you can configure ActualDbSchema to handle migrations across all schemas. To do so, add the following configuration to your initializer file (`config/initializers/actual_db_schema.rb`): diff --git a/lib/actual_db_schema/configuration.rb b/lib/actual_db_schema/configuration.rb index bb0c893..79de47e 100644 --- a/lib/actual_db_schema/configuration.rb +++ b/lib/actual_db_schema/configuration.rb @@ -4,7 +4,7 @@ module ActualDbSchema # Manages the configuration settings for the gem. class Configuration attr_accessor :enabled, :auto_rollback_disabled, :ui_enabled, :git_hooks_enabled, :multi_tenant_schemas, - :console_migrations_enabled, :migrated_folder, :migrations_storage + :console_migrations_enabled, :migrated_folder, :migrations_storage, :excluded_databases def initialize apply_defaults(default_settings) @@ -40,10 +40,17 @@ def default_settings multi_tenant_schemas: nil, console_migrations_enabled: ENV["ACTUAL_DB_SCHEMA_CONSOLE_MIGRATIONS_ENABLED"].present?, migrated_folder: ENV["ACTUAL_DB_SCHEMA_MIGRATED_FOLDER"].present?, - migrations_storage: ENV.fetch("ACTUAL_DB_SCHEMA_MIGRATIONS_STORAGE", "file").to_sym + migrations_storage: ENV.fetch("ACTUAL_DB_SCHEMA_MIGRATIONS_STORAGE", "file").to_sym, + excluded_databases: parse_excluded_databases_env } end + def parse_excluded_databases_env + return [] unless ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"].present? + + ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"].split(",").map(&:strip).map(&:to_sym) + end + def apply_defaults(settings) settings.each do |key, value| instance_variable_set("@#{key}", value) diff --git a/lib/actual_db_schema/migration_context.rb b/lib/actual_db_schema/migration_context.rb index 338efb6..a6ae9f2 100644 --- a/lib/actual_db_schema/migration_context.rb +++ b/lib/actual_db_schema/migration_context.rb @@ -20,11 +20,28 @@ def establish_connection(db_config) end def configs - # Rails < 6.0 has a Hash in configurations - if ActiveRecord::Base.configurations.is_a?(Hash) - [ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env]] - else - ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env) + all_configs = if ActiveRecord::Base.configurations.is_a?(Hash) + # Rails < 6.0 has a Hash in configurations + [ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env]] + else + ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env) + end + + filter_configs(all_configs) + end + + def filter_configs(all_configs) + all_configs.select do |db_config| + # Skip if database is in the excluded list + db_name = db_config.respond_to?(:name) ? db_config.name.to_sym : :primary + next false if ActualDbSchema.config.excluded_databases&.include?(db_name) + + # Skip if database_tasks is explicitly set to false + config_hash = db_config.respond_to?(:configuration_hash) ? db_config.configuration_hash : db_config + next false if config_hash.is_a?(Hash) && config_hash["database_tasks"] == false + next false if config_hash.is_a?(Hash) && config_hash[:database_tasks] == false + + true end end diff --git a/test/test_database_filtering.rb b/test/test_database_filtering.rb new file mode 100644 index 0000000..d160711 --- /dev/null +++ b/test/test_database_filtering.rb @@ -0,0 +1,186 @@ +# frozen_string_literal: true + +require "test_helper" + +describe "database filtering" do + let(:utils) do + TestUtils.new( + migrations_path: ["db/migrate", "db/migrate_secondary"], + migrated_path: ["tmp/migrated", "tmp/migrated_migrate_secondary"] + ) + end + + before do + # Reset to default config + ActualDbSchema.config.excluded_databases = [] + end + + describe "with excluded_databases configuration" do + it "excludes databases from the excluded_databases list" do + db_config = TestingState.db_config.dup + utils.reset_database_yml(db_config) + ActiveRecord::Base.configurations = { "test" => db_config } + ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } + + # Configure to exclude secondary database + ActualDbSchema.config.excluded_databases = [:secondary] + + # Get the migration context instance + context = ActualDbSchema::MigrationContext.instance + + # Verify only primary database is included + configs = context.send(:configs) + config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + + assert_includes config_names, :primary + refute_includes config_names, :secondary + end + + it "allows excluding multiple databases" do + db_config = { + "primary" => TestingState.db_config["primary"], + "secondary" => TestingState.db_config["secondary"], + "queue" => { + "adapter" => "sqlite3", + "database" => "tmp/queue.sqlite3", + "migrations_paths" => Rails.root.join("db", "migrate_queue").to_s + } + } + + utils.reset_database_yml(db_config) + ActiveRecord::Base.configurations = { "test" => db_config } + ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } + + # Configure to exclude secondary and queue databases + ActualDbSchema.config.excluded_databases = [:secondary, :queue] + + # Get the migration context instance + context = ActualDbSchema::MigrationContext.instance + + # Verify only primary database is included + configs = context.send(:configs) + config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + + assert_includes config_names, :primary + refute_includes config_names, :secondary + refute_includes config_names, :queue + end + + it "processes all databases when excluded_databases is empty" do + db_config = TestingState.db_config.dup + utils.reset_database_yml(db_config) + ActiveRecord::Base.configurations = { "test" => db_config } + ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } + + ActualDbSchema.config.excluded_databases = [] + + context = ActualDbSchema::MigrationContext.instance + configs = context.send(:configs) + config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + + assert_includes config_names, :primary + assert_includes config_names, :secondary + end + end + + describe "with database_tasks: false" do + it "excludes databases marked with database_tasks: false" do + db_config = TestingState.db_config.dup + # Add database_tasks: false to secondary database + db_config["secondary"]["database_tasks"] = false + + utils.reset_database_yml(db_config) + ActiveRecord::Base.configurations = { "test" => db_config } + ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } + + context = ActualDbSchema::MigrationContext.instance + configs = context.send(:configs) + config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + + assert_includes config_names, :primary + refute_includes config_names, :secondary + end + + it "handles symbol keys for database_tasks" do + db_config = { + "primary" => TestingState.db_config["primary"], + "queue" => { + "adapter" => "sqlite3", + "database" => "tmp/queue.sqlite3", + "migrations_paths" => Rails.root.join("db", "migrate_queue").to_s, + "database_tasks" => false + } + } + + utils.reset_database_yml(db_config) + ActiveRecord::Base.configurations = { "test" => db_config } + ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } + + context = ActualDbSchema::MigrationContext.instance + configs = context.send(:configs) + config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + + assert_includes config_names, :primary + refute_includes config_names, :queue + end + end + + describe "environment variable ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES" do + it "parses comma-separated database names from environment variable" do + ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "queue,cable" + + # Create a new configuration to pick up the env var + config = ActualDbSchema::Configuration.new + + assert_equal [:queue, :cable], config.excluded_databases + ensure + ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") + end + + it "handles whitespace in environment variable" do + ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "queue, cable, cache" + + config = ActualDbSchema::Configuration.new + + assert_equal [:queue, :cable, :cache], config.excluded_databases + ensure + ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") + end + + it "returns empty array when environment variable is not set" do + ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") + + config = ActualDbSchema::Configuration.new + + assert_equal [], config.excluded_databases + end + end + + describe "combined filtering" do + it "excludes databases matching either excluded_databases or database_tasks: false" do + db_config = { + "primary" => TestingState.db_config["primary"], + "secondary" => TestingState.db_config["secondary"].merge("database_tasks" => false), + "queue" => { + "adapter" => "sqlite3", + "database" => "tmp/queue.sqlite3", + "migrations_paths" => Rails.root.join("db", "migrate_queue").to_s + } + } + + utils.reset_database_yml(db_config) + ActiveRecord::Base.configurations = { "test" => db_config } + ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } + + # Exclude queue via configuration + ActualDbSchema.config.excluded_databases = [:queue] + + context = ActualDbSchema::MigrationContext.instance + configs = context.send(:configs) + config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + + # Only primary should be included + assert_equal [:primary], config_names + end + end +end From 08a07e90b06e5da7ee3e3f4e49b05438604ed08c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:37:37 +0000 Subject: [PATCH 03/15] Address code review feedback - improve filtering logic and tests Co-authored-by: ka8725 <243846+ka8725@users.noreply.github.com> --- README.md | 2 ++ lib/actual_db_schema/configuration.rb | 6 +++- lib/actual_db_schema/migration_context.rb | 6 ++-- test/test_database_filtering.rb | 41 +++++++++++++++++++++-- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 44caada..094c7d1 100644 --- a/README.md +++ b/README.md @@ -313,6 +313,8 @@ Set the environment variable `ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES` with a comma- export ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES="queue,cable,cache" ``` +**Note:** If both the environment variable and the configuration setting in the initializer are provided, the configuration setting takes precedence as it's applied after the default settings are loaded. + ### Combined Approach Both `database_tasks: false` and `excluded_databases` work together. A database will be skipped if it matches either criterion: diff --git a/lib/actual_db_schema/configuration.rb b/lib/actual_db_schema/configuration.rb index 79de47e..27b6e5d 100644 --- a/lib/actual_db_schema/configuration.rb +++ b/lib/actual_db_schema/configuration.rb @@ -48,7 +48,11 @@ def default_settings def parse_excluded_databases_env return [] unless ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"].present? - ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"].split(",").map(&:strip).map(&:to_sym) + ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] + .split(",") + .map(&:strip) + .reject(&:empty?) + .map(&:to_sym) end def apply_defaults(settings) diff --git a/lib/actual_db_schema/migration_context.rb b/lib/actual_db_schema/migration_context.rb index a6ae9f2..34f6629 100644 --- a/lib/actual_db_schema/migration_context.rb +++ b/lib/actual_db_schema/migration_context.rb @@ -34,12 +34,12 @@ def filter_configs(all_configs) all_configs.select do |db_config| # Skip if database is in the excluded list db_name = db_config.respond_to?(:name) ? db_config.name.to_sym : :primary - next false if ActualDbSchema.config.excluded_databases&.include?(db_name) + next false if ActualDbSchema.config.excluded_databases.include?(db_name) # Skip if database_tasks is explicitly set to false config_hash = db_config.respond_to?(:configuration_hash) ? db_config.configuration_hash : db_config - next false if config_hash.is_a?(Hash) && config_hash["database_tasks"] == false - next false if config_hash.is_a?(Hash) && config_hash[:database_tasks] == false + database_tasks = config_hash.is_a?(Hash) ? (config_hash["database_tasks"] || config_hash[:database_tasks]) : nil + next false if database_tasks == false true end diff --git a/test/test_database_filtering.rb b/test/test_database_filtering.rb index d160711..80d8988 100644 --- a/test/test_database_filtering.rb +++ b/test/test_database_filtering.rb @@ -84,7 +84,7 @@ end describe "with database_tasks: false" do - it "excludes databases marked with database_tasks: false" do + it "excludes databases marked with database_tasks: false using string keys" do db_config = TestingState.db_config.dup # Add database_tasks: false to secondary database db_config["secondary"]["database_tasks"] = false @@ -101,7 +101,24 @@ refute_includes config_names, :secondary end - it "handles symbol keys for database_tasks" do + it "excludes databases marked with database_tasks: false using symbol keys" do + db_config = TestingState.db_config.dup + # Add database_tasks: false to secondary database with symbol key + db_config["secondary"][:database_tasks] = false + + utils.reset_database_yml(db_config) + ActiveRecord::Base.configurations = { "test" => db_config } + ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } + + context = ActualDbSchema::MigrationContext.instance + configs = context.send(:configs) + config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + + assert_includes config_names, :primary + refute_includes config_names, :secondary + end + + it "handles mixed string and symbol keys for database_tasks" do db_config = { "primary" => TestingState.db_config["primary"], "queue" => { @@ -154,6 +171,26 @@ assert_equal [], config.excluded_databases end + + it "handles empty string in environment variable" do + ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "" + + config = ActualDbSchema::Configuration.new + + assert_equal [], config.excluded_databases + ensure + ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") + end + + it "filters out empty values from comma-separated list" do + ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "queue,,cable, ,cache" + + config = ActualDbSchema::Configuration.new + + assert_equal [:queue, :cable, :cache], config.excluded_databases + ensure + ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") + end end describe "combined filtering" do From 8cc53f409ff44af2adbb7871bd278d3469766745 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:32:01 +0000 Subject: [PATCH 04/15] Remove database_tasks: false filtering - keep only excluded_databases Co-authored-by: ka8725 <243846+ka8725@users.noreply.github.com> --- README.md | 46 +----------- lib/actual_db_schema/migration_context.rb | 9 +-- test/test_database_filtering.rb | 87 ----------------------- 3 files changed, 3 insertions(+), 139 deletions(-) diff --git a/README.md b/README.md index 094c7d1..6e3f3c4 100644 --- a/README.md +++ b/README.md @@ -275,26 +275,8 @@ Modern Rails applications often use the `connects_to` pattern for infrastructure - **Solid Queue** (Rails 8 default job backend) - **Solid Cable** (WebSocket connections) - **Solid Cache** (caching infrastructure) -- Any database marked with `database_tasks: false` - -### Method 1: Using `database_tasks: false` in `database.yml` - -ActualDbSchema automatically respects Rails' `database_tasks: false` setting. Add this to your infrastructure databases: - -```yaml -# config/database.yml -development: - primary: - adapter: mysql2 - database: my_app_development - queue: - adapter: mysql2 - database: my_app_queue - database_tasks: false # ActualDbSchema will skip this database - migrations_paths: db/queue_migrate -``` -### Method 2: Using `excluded_databases` Configuration +### Method 1: Using `excluded_databases` Configuration Explicitly exclude databases by name in your initializer: @@ -305,7 +287,7 @@ ActualDbSchema.configure do |config| end ``` -### Method 3: Using Environment Variable +### Method 2: Using Environment Variable Set the environment variable `ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES` with a comma-separated list: @@ -315,30 +297,6 @@ export ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES="queue,cable,cache" **Note:** If both the environment variable and the configuration setting in the initializer are provided, the configuration setting takes precedence as it's applied after the default settings are loaded. -### Combined Approach - -Both `database_tasks: false` and `excluded_databases` work together. A database will be skipped if it matches either criterion: - -```yaml -# config/database.yml -development: - queue: - database_tasks: false # Excluded via database.yml - cable: - adapter: mysql2 - database: my_app_cable - # Not marked as database_tasks: false, but can be excluded via config -``` - -```ruby -# config/initializers/actual_db_schema.rb -ActualDbSchema.configure do |config| - config.excluded_databases = [:cable] # Explicitly exclude cable -end -``` - -In this example, both `queue` and `cable` databases will be excluded from ActualDbSchema processing. - ## Multi-Tenancy Support If your application leverages multiple schemas for multi-tenancy — such as those implemented by the [apartment](https://github.com/influitive/apartment) gem or similar solutions — you can configure ActualDbSchema to handle migrations across all schemas. To do so, add the following configuration to your initializer file (`config/initializers/actual_db_schema.rb`): diff --git a/lib/actual_db_schema/migration_context.rb b/lib/actual_db_schema/migration_context.rb index 34f6629..d5e34db 100644 --- a/lib/actual_db_schema/migration_context.rb +++ b/lib/actual_db_schema/migration_context.rb @@ -34,14 +34,7 @@ def filter_configs(all_configs) all_configs.select do |db_config| # Skip if database is in the excluded list db_name = db_config.respond_to?(:name) ? db_config.name.to_sym : :primary - next false if ActualDbSchema.config.excluded_databases.include?(db_name) - - # Skip if database_tasks is explicitly set to false - config_hash = db_config.respond_to?(:configuration_hash) ? db_config.configuration_hash : db_config - database_tasks = config_hash.is_a?(Hash) ? (config_hash["database_tasks"] || config_hash[:database_tasks]) : nil - next false if database_tasks == false - - true + !ActualDbSchema.config.excluded_databases.include?(db_name) end end diff --git a/test/test_database_filtering.rb b/test/test_database_filtering.rb index 80d8988..df9f8e8 100644 --- a/test/test_database_filtering.rb +++ b/test/test_database_filtering.rb @@ -83,65 +83,6 @@ end end - describe "with database_tasks: false" do - it "excludes databases marked with database_tasks: false using string keys" do - db_config = TestingState.db_config.dup - # Add database_tasks: false to secondary database - db_config["secondary"]["database_tasks"] = false - - utils.reset_database_yml(db_config) - ActiveRecord::Base.configurations = { "test" => db_config } - ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } - - context = ActualDbSchema::MigrationContext.instance - configs = context.send(:configs) - config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } - - assert_includes config_names, :primary - refute_includes config_names, :secondary - end - - it "excludes databases marked with database_tasks: false using symbol keys" do - db_config = TestingState.db_config.dup - # Add database_tasks: false to secondary database with symbol key - db_config["secondary"][:database_tasks] = false - - utils.reset_database_yml(db_config) - ActiveRecord::Base.configurations = { "test" => db_config } - ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } - - context = ActualDbSchema::MigrationContext.instance - configs = context.send(:configs) - config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } - - assert_includes config_names, :primary - refute_includes config_names, :secondary - end - - it "handles mixed string and symbol keys for database_tasks" do - db_config = { - "primary" => TestingState.db_config["primary"], - "queue" => { - "adapter" => "sqlite3", - "database" => "tmp/queue.sqlite3", - "migrations_paths" => Rails.root.join("db", "migrate_queue").to_s, - "database_tasks" => false - } - } - - utils.reset_database_yml(db_config) - ActiveRecord::Base.configurations = { "test" => db_config } - ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } - - context = ActualDbSchema::MigrationContext.instance - configs = context.send(:configs) - config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } - - assert_includes config_names, :primary - refute_includes config_names, :queue - end - end - describe "environment variable ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES" do it "parses comma-separated database names from environment variable" do ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "queue,cable" @@ -192,32 +133,4 @@ ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") end end - - describe "combined filtering" do - it "excludes databases matching either excluded_databases or database_tasks: false" do - db_config = { - "primary" => TestingState.db_config["primary"], - "secondary" => TestingState.db_config["secondary"].merge("database_tasks" => false), - "queue" => { - "adapter" => "sqlite3", - "database" => "tmp/queue.sqlite3", - "migrations_paths" => Rails.root.join("db", "migrate_queue").to_s - } - } - - utils.reset_database_yml(db_config) - ActiveRecord::Base.configurations = { "test" => db_config } - ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } - - # Exclude queue via configuration - ActualDbSchema.config.excluded_databases = [:queue] - - context = ActualDbSchema::MigrationContext.instance - configs = context.send(:configs) - config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } - - # Only primary should be included - assert_equal [:primary], config_names - end - end end From 985b90fdeb582a01bed57e10839b6de5c48535a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:27:42 +0000 Subject: [PATCH 05/15] Initial plan From ca956516023095c4ce79f481444ab0856305530b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:56:48 +0000 Subject: [PATCH 06/15] Rebase on main and fix rubocop offenses Co-authored-by: ka8725 <243846+ka8725@users.noreply.github.com> --- Gemfile.lock | 6 +-- lib/actual_db_schema/migration_context.rb | 4 +- test/test_database_filtering.rb | 52 +++++++++++------------ 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8f2f952..f56eaba 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -89,7 +89,7 @@ GEM bundler rake thor (>= 0.14.0) - ast (2.4.2) + ast (2.4.3) base64 (0.1.1) bigdecimal (3.1.4) builder (3.2.4) @@ -143,13 +143,13 @@ GEM nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) parallel (1.23.0) - parser (3.2.2.4) + parser (3.3.10.1) ast (~> 2.4.1) racc prism (1.8.0) psych (5.1.1.1) stringio - racc (1.7.3) + racc (1.8.1) rack (3.0.8) rack-session (2.0.0) rack (>= 3.0.0) diff --git a/lib/actual_db_schema/migration_context.rb b/lib/actual_db_schema/migration_context.rb index d5e34db..bc5998e 100644 --- a/lib/actual_db_schema/migration_context.rb +++ b/lib/actual_db_schema/migration_context.rb @@ -31,10 +31,10 @@ def configs end def filter_configs(all_configs) - all_configs.select do |db_config| + all_configs.reject do |db_config| # Skip if database is in the excluded list db_name = db_config.respond_to?(:name) ? db_config.name.to_sym : :primary - !ActualDbSchema.config.excluded_databases.include?(db_name) + ActualDbSchema.config.excluded_databases.include?(db_name) end end diff --git a/test/test_database_filtering.rb b/test/test_database_filtering.rb index df9f8e8..8d623c9 100644 --- a/test/test_database_filtering.rb +++ b/test/test_database_filtering.rb @@ -21,17 +21,17 @@ utils.reset_database_yml(db_config) ActiveRecord::Base.configurations = { "test" => db_config } ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } - + # Configure to exclude secondary database ActualDbSchema.config.excluded_databases = [:secondary] - + # Get the migration context instance context = ActualDbSchema::MigrationContext.instance - + # Verify only primary database is included configs = context.send(:configs) config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } - + assert_includes config_names, :primary refute_includes config_names, :secondary end @@ -46,21 +46,21 @@ "migrations_paths" => Rails.root.join("db", "migrate_queue").to_s } } - + utils.reset_database_yml(db_config) ActiveRecord::Base.configurations = { "test" => db_config } ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } - + # Configure to exclude secondary and queue databases - ActualDbSchema.config.excluded_databases = [:secondary, :queue] - + ActualDbSchema.config.excluded_databases = %i[secondary queue] + # Get the migration context instance context = ActualDbSchema::MigrationContext.instance - + # Verify only primary database is included configs = context.send(:configs) config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } - + assert_includes config_names, :primary refute_includes config_names, :secondary refute_includes config_names, :queue @@ -71,13 +71,13 @@ utils.reset_database_yml(db_config) ActiveRecord::Base.configurations = { "test" => db_config } ActiveRecord::Tasks::DatabaseTasks.database_configuration = { "test" => db_config } - + ActualDbSchema.config.excluded_databases = [] - + context = ActualDbSchema::MigrationContext.instance configs = context.send(:configs) config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } - + assert_includes config_names, :primary assert_includes config_names, :secondary end @@ -86,38 +86,38 @@ describe "environment variable ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES" do it "parses comma-separated database names from environment variable" do ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "queue,cable" - + # Create a new configuration to pick up the env var config = ActualDbSchema::Configuration.new - - assert_equal [:queue, :cable], config.excluded_databases + + assert_equal %i[queue cable], config.excluded_databases ensure ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") end it "handles whitespace in environment variable" do ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "queue, cable, cache" - + config = ActualDbSchema::Configuration.new - - assert_equal [:queue, :cable, :cache], config.excluded_databases + + assert_equal %i[queue cable cache], config.excluded_databases ensure ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") end it "returns empty array when environment variable is not set" do ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") - + config = ActualDbSchema::Configuration.new - + assert_equal [], config.excluded_databases end it "handles empty string in environment variable" do ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "" - + config = ActualDbSchema::Configuration.new - + assert_equal [], config.excluded_databases ensure ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") @@ -125,10 +125,10 @@ it "filters out empty values from comma-separated list" do ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"] = "queue,,cable, ,cache" - + config = ActualDbSchema::Configuration.new - - assert_equal [:queue, :cable, :cache], config.excluded_databases + + assert_equal %i[queue cable cache], config.excluded_databases ensure ENV.delete("ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES") end From 73d4b9204318058bd9743d6bcdb1af674804ee7c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:06:45 +0000 Subject: [PATCH 07/15] Fix rubocop AbcSize offense by refactoring default_settings Co-authored-by: ka8725 <243846+ka8725@users.noreply.github.com> --- lib/actual_db_schema/configuration.rb | 28 +++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/actual_db_schema/configuration.rb b/lib/actual_db_schema/configuration.rb index 27b6e5d..f4e736d 100644 --- a/lib/actual_db_schema/configuration.rb +++ b/lib/actual_db_schema/configuration.rb @@ -33,18 +33,34 @@ def fetch(key, default = nil) def default_settings { - enabled: Rails.env.development?, - auto_rollback_disabled: ENV["ACTUAL_DB_SCHEMA_AUTO_ROLLBACK_DISABLED"].present?, - ui_enabled: Rails.env.development? || ENV["ACTUAL_DB_SCHEMA_UI_ENABLED"].present?, - git_hooks_enabled: ENV["ACTUAL_DB_SCHEMA_GIT_HOOKS_ENABLED"].present?, + enabled: enabled_by_default?, + auto_rollback_disabled: env_enabled?("ACTUAL_DB_SCHEMA_AUTO_ROLLBACK_DISABLED"), + ui_enabled: ui_enabled_by_default?, + git_hooks_enabled: env_enabled?("ACTUAL_DB_SCHEMA_GIT_HOOKS_ENABLED"), multi_tenant_schemas: nil, - console_migrations_enabled: ENV["ACTUAL_DB_SCHEMA_CONSOLE_MIGRATIONS_ENABLED"].present?, + console_migrations_enabled: env_enabled?("ACTUAL_DB_SCHEMA_CONSOLE_MIGRATIONS_ENABLED"), migrated_folder: ENV["ACTUAL_DB_SCHEMA_MIGRATED_FOLDER"].present?, - migrations_storage: ENV.fetch("ACTUAL_DB_SCHEMA_MIGRATIONS_STORAGE", "file").to_sym, + migrations_storage: migrations_storage_from_env, excluded_databases: parse_excluded_databases_env } end + def enabled_by_default? + Rails.env.development? + end + + def ui_enabled_by_default? + Rails.env.development? || env_enabled?("ACTUAL_DB_SCHEMA_UI_ENABLED") + end + + def env_enabled?(key) + ENV[key].present? + end + + def migrations_storage_from_env + ENV.fetch("ACTUAL_DB_SCHEMA_MIGRATIONS_STORAGE", "file").to_sym + end + def parse_excluded_databases_env return [] unless ENV["ACTUAL_DB_SCHEMA_EXCLUDED_DATABASES"].present? From b33fd34fb703e344a5302a312c17827cc11ba806 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:15:29 +0000 Subject: [PATCH 08/15] Fix test isolation: Reset excluded_databases after each test Added 'after' block to clean up configuration state between tests to prevent test pollution. The excluded_databases configuration was persisting across tests, causing failures in multi-database tests. --- test/test_database_filtering.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test_database_filtering.rb b/test/test_database_filtering.rb index 8d623c9..1af92d5 100644 --- a/test/test_database_filtering.rb +++ b/test/test_database_filtering.rb @@ -15,6 +15,11 @@ ActualDbSchema.config.excluded_databases = [] end + after do + # Clean up configuration after each test + ActualDbSchema.config.excluded_databases = [] + end + describe "with excluded_databases configuration" do it "excludes databases from the excluded_databases list" do db_config = TestingState.db_config.dup From de5213d603d8e995cd320710d8b479c52372d534 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 21:57:28 +0000 Subject: [PATCH 09/15] Fix database filtering for Rails < 6.0 Hash-based configurations For Rails < 6.0, ActiveRecord::Base.configurations returns a Hash where database names are keys (e.g., {primary: {...}, secondary: {...}}). The previous filtering logic tried to filter the Hash itself as if it were a config object, which didn't work correctly. This fix detects the Rails < 6.0 Hash format and filters by rejecting keys (database names) from the Hash, then returns the filtered Hash wrapped in an array to maintain the expected structure. Fixes Ruby 2.7 / Rails 6.0 test failure. Co-authored-by: ka8725 <243846+ka8725@users.noreply.github.com> --- lib/actual_db_schema/migration_context.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/actual_db_schema/migration_context.rb b/lib/actual_db_schema/migration_context.rb index bc5998e..1e4480e 100644 --- a/lib/actual_db_schema/migration_context.rb +++ b/lib/actual_db_schema/migration_context.rb @@ -31,6 +31,16 @@ def configs end def filter_configs(all_configs) + # Handle Rails < 6.0 where configs is a Hash + if all_configs.is_a?(Array) && all_configs.first.is_a?(Hash) && !all_configs.first.respond_to?(:name) + # For Rails < 6.0, we have a single Hash with database names as keys + filtered_hash = all_configs.first.reject do |db_name, _config| + ActualDbSchema.config.excluded_databases.include?(db_name.to_sym) + end + return [filtered_hash] + end + + # Handle Rails >= 6.0 where configs is an array of config objects all_configs.reject do |db_config| # Skip if database is in the excluded list db_name = db_config.respond_to?(:name) ? db_config.name.to_sym : :primary From 7437be86895876ebaa7ae8362bf3bf7d07430d98 Mon Sep 17 00:00:00 2001 From: Andrei Kaleshka Date: Thu, 5 Feb 2026 23:06:51 +0100 Subject: [PATCH 10/15] fixes --- gemfiles/.bundle/config | 2 ++ gemfiles/rails.6.0.gemfile | 5 ----- gemfiles/rails.6.1.gemfile | 5 ----- gemfiles/rails.7.0.gemfile | 5 ----- gemfiles/rails.7.1.gemfile | 5 ----- gemfiles/rails.edge.gemfile | 5 ----- lib/actual_db_schema/migration_context.rb | 9 ++++++++- test/test_database_filtering.rb | 17 ++++++++++++++--- test/test_helper.rb | 4 ++++ 9 files changed, 28 insertions(+), 29 deletions(-) create mode 100644 gemfiles/.bundle/config diff --git a/gemfiles/.bundle/config b/gemfiles/.bundle/config new file mode 100644 index 0000000..c127f80 --- /dev/null +++ b/gemfiles/.bundle/config @@ -0,0 +1,2 @@ +--- +BUNDLE_RETRY: "1" diff --git a/gemfiles/rails.6.0.gemfile b/gemfiles/rails.6.0.gemfile index 7cf9301..0ec7d89 100644 --- a/gemfiles/rails.6.0.gemfile +++ b/gemfiles/rails.6.0.gemfile @@ -1,5 +1,3 @@ -# frozen_string_literal: true - # This file was generated by Appraisal source "https://rubygems.org" @@ -7,10 +5,7 @@ source "https://rubygems.org" gem "activerecord", "~> 6.0.0" gem "activesupport", "~> 6.0.0" gem "minitest", "~> 5.0" -gem "mysql2", "~> 0.5.2" -gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" -gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.6.1.gemfile b/gemfiles/rails.6.1.gemfile index 0f8bfe0..a838179 100644 --- a/gemfiles/rails.6.1.gemfile +++ b/gemfiles/rails.6.1.gemfile @@ -1,5 +1,3 @@ -# frozen_string_literal: true - # This file was generated by Appraisal source "https://rubygems.org" @@ -7,10 +5,7 @@ source "https://rubygems.org" gem "activerecord", "~> 6.1.0" gem "activesupport", "~> 6.1.0" gem "minitest", "~> 5.0" -gem "mysql2", "~> 0.5.2" -gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" -gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.7.0.gemfile b/gemfiles/rails.7.0.gemfile index 3efdd01..18e1459 100644 --- a/gemfiles/rails.7.0.gemfile +++ b/gemfiles/rails.7.0.gemfile @@ -1,5 +1,3 @@ -# frozen_string_literal: true - # This file was generated by Appraisal source "https://rubygems.org" @@ -7,10 +5,7 @@ source "https://rubygems.org" gem "activerecord", "~> 7.0.0" gem "activesupport", "~> 7.0.0" gem "minitest", "~> 5.0" -gem "mysql2", "~> 0.5.2" -gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" -gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.7.1.gemfile b/gemfiles/rails.7.1.gemfile index 4dc05c6..7c3b6ca 100644 --- a/gemfiles/rails.7.1.gemfile +++ b/gemfiles/rails.7.1.gemfile @@ -1,5 +1,3 @@ -# frozen_string_literal: true - # This file was generated by Appraisal source "https://rubygems.org" @@ -7,10 +5,7 @@ source "https://rubygems.org" gem "activerecord", "~> 7.1.0" gem "activesupport", "~> 7.1.0" gem "minitest", "~> 5.0" -gem "mysql2", "~> 0.5.2" -gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" -gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.edge.gemfile b/gemfiles/rails.edge.gemfile index 52a7cdd..f880022 100644 --- a/gemfiles/rails.edge.gemfile +++ b/gemfiles/rails.edge.gemfile @@ -1,5 +1,3 @@ -# frozen_string_literal: true - # This file was generated by Appraisal source "https://rubygems.org" @@ -7,11 +5,8 @@ source "https://rubygems.org" gem "activerecord", ">= 7.2.0.beta" gem "activesupport", ">= 7.2.0.beta" gem "minitest", "~> 5.0" -gem "mysql2", "~> 0.5.2" -gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" gem "rails", ">= 7.2.0.beta" -gem "sqlite3" gemspec path: "../" diff --git a/lib/actual_db_schema/migration_context.rb b/lib/actual_db_schema/migration_context.rb index 1e4480e..ec0e920 100644 --- a/lib/actual_db_schema/migration_context.rb +++ b/lib/actual_db_schema/migration_context.rb @@ -43,7 +43,14 @@ def filter_configs(all_configs) # Handle Rails >= 6.0 where configs is an array of config objects all_configs.reject do |db_config| # Skip if database is in the excluded list - db_name = db_config.respond_to?(:name) ? db_config.name.to_sym : :primary + # Rails 6.0 uses spec_name, Rails 6.1+ uses name + db_name = if db_config.respond_to?(:name) + db_config.name.to_sym + elsif db_config.respond_to?(:spec_name) + db_config.spec_name.to_sym + else + :primary + end ActualDbSchema.config.excluded_databases.include?(db_name) end end diff --git a/test/test_database_filtering.rb b/test/test_database_filtering.rb index 1af92d5..b8e545d 100644 --- a/test/test_database_filtering.rb +++ b/test/test_database_filtering.rb @@ -10,6 +10,17 @@ ) end + # Helper to extract config name that works with Rails 6.0 (spec_name) and Rails 6.1+ (name) + def config_name(db_config) + if db_config.respond_to?(:name) + db_config.name.to_sym + elsif db_config.respond_to?(:spec_name) + db_config.spec_name.to_sym + else + :primary + end + end + before do # Reset to default config ActualDbSchema.config.excluded_databases = [] @@ -35,7 +46,7 @@ # Verify only primary database is included configs = context.send(:configs) - config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + config_names = configs.map { |c| config_name(c) } assert_includes config_names, :primary refute_includes config_names, :secondary @@ -64,7 +75,7 @@ # Verify only primary database is included configs = context.send(:configs) - config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + config_names = configs.map { |c| config_name(c) } assert_includes config_names, :primary refute_includes config_names, :secondary @@ -81,7 +92,7 @@ context = ActualDbSchema::MigrationContext.instance configs = context.send(:configs) - config_names = configs.map { |c| c.respond_to?(:name) ? c.name.to_sym : :primary } + config_names = configs.map { |c| config_name(c) } assert_includes config_names, :primary assert_includes config_names, :secondary diff --git a/test/test_helper.rb b/test/test_helper.rb index 10dfb23..25d1a45 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true $LOAD_PATH.unshift File.expand_path("../lib", __dir__) + +# Clear DATABASE_URL to prevent it from overriding the test database configuration +ENV.delete("DATABASE_URL") + require "logger" require "rails/all" require "actual_db_schema" From 272d85405ab243e763f3cc3d17e4a963904421bc Mon Sep 17 00:00:00 2001 From: Andrei Kaleshka Date: Thu, 5 Feb 2026 23:08:41 +0100 Subject: [PATCH 11/15] Revert "Fix database filtering for Rails < 6.0 Hash-based configurations" This reverts commit de5213d603d8e995cd320710d8b479c52372d534. --- lib/actual_db_schema/migration_context.rb | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib/actual_db_schema/migration_context.rb b/lib/actual_db_schema/migration_context.rb index ec0e920..462444f 100644 --- a/lib/actual_db_schema/migration_context.rb +++ b/lib/actual_db_schema/migration_context.rb @@ -31,16 +31,6 @@ def configs end def filter_configs(all_configs) - # Handle Rails < 6.0 where configs is a Hash - if all_configs.is_a?(Array) && all_configs.first.is_a?(Hash) && !all_configs.first.respond_to?(:name) - # For Rails < 6.0, we have a single Hash with database names as keys - filtered_hash = all_configs.first.reject do |db_name, _config| - ActualDbSchema.config.excluded_databases.include?(db_name.to_sym) - end - return [filtered_hash] - end - - # Handle Rails >= 6.0 where configs is an array of config objects all_configs.reject do |db_config| # Skip if database is in the excluded list # Rails 6.0 uses spec_name, Rails 6.1+ uses name From 41fda7bb23a6e21f8e1f95cb8aa96067ff91f116 Mon Sep 17 00:00:00 2001 From: Andrei Kaleshka Date: Thu, 5 Feb 2026 23:13:52 +0100 Subject: [PATCH 12/15] reset gemfiles --- gemfiles/rails.6.0.gemfile | 5 +++++ gemfiles/rails.6.1.gemfile | 5 +++++ gemfiles/rails.7.0.gemfile | 5 +++++ gemfiles/rails.7.1.gemfile | 5 +++++ gemfiles/rails.edge.gemfile | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/gemfiles/rails.6.0.gemfile b/gemfiles/rails.6.0.gemfile index 0ec7d89..7cf9301 100644 --- a/gemfiles/rails.6.0.gemfile +++ b/gemfiles/rails.6.0.gemfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file was generated by Appraisal source "https://rubygems.org" @@ -5,7 +7,10 @@ source "https://rubygems.org" gem "activerecord", "~> 6.0.0" gem "activesupport", "~> 6.0.0" gem "minitest", "~> 5.0" +gem "mysql2", "~> 0.5.2" +gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" +gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.6.1.gemfile b/gemfiles/rails.6.1.gemfile index a838179..0f8bfe0 100644 --- a/gemfiles/rails.6.1.gemfile +++ b/gemfiles/rails.6.1.gemfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file was generated by Appraisal source "https://rubygems.org" @@ -5,7 +7,10 @@ source "https://rubygems.org" gem "activerecord", "~> 6.1.0" gem "activesupport", "~> 6.1.0" gem "minitest", "~> 5.0" +gem "mysql2", "~> 0.5.2" +gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" +gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.7.0.gemfile b/gemfiles/rails.7.0.gemfile index 18e1459..3efdd01 100644 --- a/gemfiles/rails.7.0.gemfile +++ b/gemfiles/rails.7.0.gemfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file was generated by Appraisal source "https://rubygems.org" @@ -5,7 +7,10 @@ source "https://rubygems.org" gem "activerecord", "~> 7.0.0" gem "activesupport", "~> 7.0.0" gem "minitest", "~> 5.0" +gem "mysql2", "~> 0.5.2" +gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" +gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.7.1.gemfile b/gemfiles/rails.7.1.gemfile index 7c3b6ca..4dc05c6 100644 --- a/gemfiles/rails.7.1.gemfile +++ b/gemfiles/rails.7.1.gemfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file was generated by Appraisal source "https://rubygems.org" @@ -5,7 +7,10 @@ source "https://rubygems.org" gem "activerecord", "~> 7.1.0" gem "activesupport", "~> 7.1.0" gem "minitest", "~> 5.0" +gem "mysql2", "~> 0.5.2" +gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" +gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails.edge.gemfile b/gemfiles/rails.edge.gemfile index f880022..52a7cdd 100644 --- a/gemfiles/rails.edge.gemfile +++ b/gemfiles/rails.edge.gemfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file was generated by Appraisal source "https://rubygems.org" @@ -5,8 +7,11 @@ source "https://rubygems.org" gem "activerecord", ">= 7.2.0.beta" gem "activesupport", ">= 7.2.0.beta" gem "minitest", "~> 5.0" +gem "mysql2", "~> 0.5.2" +gem "pg", "~> 1.5" gem "rake" gem "rubocop", "~> 1.21" gem "rails", ">= 7.2.0.beta" +gem "sqlite3" gemspec path: "../" From 7c88725390d2882801a1e2e0908f7cb3cbe0578b Mon Sep 17 00:00:00 2001 From: Andrei Kaleshka Date: Thu, 5 Feb 2026 23:15:06 +0100 Subject: [PATCH 13/15] delete file --- gemfiles/.bundle/config | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 gemfiles/.bundle/config diff --git a/gemfiles/.bundle/config b/gemfiles/.bundle/config deleted file mode 100644 index c127f80..0000000 --- a/gemfiles/.bundle/config +++ /dev/null @@ -1,2 +0,0 @@ ---- -BUNDLE_RETRY: "1" From 67ac35924ad06ad6058d05838015e92ca648134b Mon Sep 17 00:00:00 2001 From: Andrei Kaleshka Date: Thu, 5 Feb 2026 23:15:33 +0100 Subject: [PATCH 14/15] cleanup --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6d1be0d..8a3691e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ /.bundle/ -/vendor/bundle/ /.yardoc /_yardoc/ /coverage/ From 03878951f7a0f3ec7d6a270a0ee56c565fc2b249 Mon Sep 17 00:00:00 2001 From: Andrei Kaleshka Date: Thu, 5 Feb 2026 23:15:44 +0100 Subject: [PATCH 15/15] cleanup --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f56eaba..8f2f952 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -89,7 +89,7 @@ GEM bundler rake thor (>= 0.14.0) - ast (2.4.3) + ast (2.4.2) base64 (0.1.1) bigdecimal (3.1.4) builder (3.2.4) @@ -143,13 +143,13 @@ GEM nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) parallel (1.23.0) - parser (3.3.10.1) + parser (3.2.2.4) ast (~> 2.4.1) racc prism (1.8.0) psych (5.1.1.1) stringio - racc (1.8.1) + racc (1.7.3) rack (3.0.8) rack-session (2.0.0) rack (>= 3.0.0)