From 61c147655be3f67e5f3bd1a2fa283402e862076f Mon Sep 17 00:00:00 2001 From: Teo Ljungberg Date: Tue, 12 Aug 2025 15:44:40 +0200 Subject: [PATCH 1/6] Replace ammeter --- Gemfile | 1 - .../fx/function/function_generator_spec.rb | 17 ++++--- .../fx/trigger/trigger_generator_spec.rb | 46 ++++++++++++------ spec/support/generator_setup.rb | 48 +++++++++++++++++-- 4 files changed, 82 insertions(+), 30 deletions(-) diff --git a/Gemfile b/Gemfile index 8e54876e..4f8e6681 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,6 @@ source "https://rubygems.org" gemspec -gem "ammeter", ">= 1.1.3" gem "bundler", ">= 1.5" gem "database_cleaner" gem "pg" diff --git a/spec/generators/fx/function/function_generator_spec.rb b/spec/generators/fx/function/function_generator_spec.rb index a9dfcdc9..3810ac81 100644 --- a/spec/generators/fx/function/function_generator_spec.rb +++ b/spec/generators/fx/function/function_generator_spec.rb @@ -6,11 +6,11 @@ migration = file("db/migrate/create_function_test.rb") function_definition = file("db/functions/test_v01.sql") - run_generator ["test"] + run_generator(Fx::Generators::FunctionGenerator, ["test"]) expect(function_definition).to exist - expect(migration).to be_a_migration - expect(migration_file(migration)).to contain("CreateFunctionTest") + expect_to_be_a_migration(migration) + expect(migration_content(migration)).to include("CreateFunctionTest") end context "when passed --no-migration" do @@ -18,10 +18,10 @@ migration = file("db/migrate/create_function_test.rb") function_definition = file("db/functions/test_v01.sql") - run_generator ["test", "--no-migration"] + run_generator(Fx::Generators::FunctionGenerator, ["test"], {migration: false}) expect(function_definition).to exist - expect(Pathname.new(migration_file(migration))).not_to exist + expect(migration).not_to exist end end @@ -35,12 +35,11 @@ migration = file("db/migrate/update_function_test_to_version_2.rb") function_definition = file("db/functions/test_v02.sql") - run_generator ["test"] + run_generator(Fx::Generators::FunctionGenerator, ["test"]) expect(function_definition).to exist - expect(migration).to be_a_migration - expect(migration_file(migration)) - .to contain("UpdateFunctionTestToVersion2") + expect_to_be_a_migration(migration) + expect(migration_content(migration)).to include("UpdateFunctionTestToVersion2") end end end diff --git a/spec/generators/fx/trigger/trigger_generator_spec.rb b/spec/generators/fx/trigger/trigger_generator_spec.rb index b56305dc..fcb62457 100644 --- a/spec/generators/fx/trigger/trigger_generator_spec.rb +++ b/spec/generators/fx/trigger/trigger_generator_spec.rb @@ -6,12 +6,15 @@ migration = file("db/migrate/create_trigger_test.rb") trigger_definition = file("db/triggers/test_v01.sql") - run_generator ["test", "table_name" => "some_table"] + run_generator( + Fx::Generators::TriggerGenerator, + ["test", {"table_name" => "some_table"}] + ) expect(trigger_definition).to exist - expect(migration).to be_a_migration - expect(migration_file(migration)).to contain("CreateTriggerTest") - expect(migration_file(migration)).to contain("on: :some_table") + expect_to_be_a_migration(migration) + expect(migration_content(migration)).to include("CreateTriggerTest") + expect(migration_content(migration)).to include("on: :some_table") end context "when passed --no-migration" do @@ -19,10 +22,14 @@ migration = file("db/migrate/create_trigger_test.rb") trigger_definition = file("db/triggers/test_v01.sql") - run_generator ["test", {"table_name" => "some_table"}, "--no-migration"] + run_generator( + Fx::Generators::TriggerGenerator, + ["test", {"table_name" => "some_table"}], + {migration: false} + ) expect(trigger_definition).to exist - expect(Pathname.new(migration_file(migration))).not_to exist + expect(migration).not_to exist end end @@ -30,17 +37,23 @@ migration = file("db/migrate/create_trigger_test.rb") trigger_definition = file("db/triggers/test_v01.sql") - run_generator ["test", "on" => "some_table"] + run_generator( + Fx::Generators::TriggerGenerator, + ["test", {"on" => "some_table"}] + ) expect(trigger_definition).to exist - expect(migration).to be_a_migration - expect(migration_file(migration)).to contain("CreateTriggerTest") - expect(migration_file(migration)).to contain("on: :some_table") + expect_to_be_a_migration(migration) + expect(migration_content(migration)).to include("CreateTriggerTest") + expect(migration_content(migration)).to include("on: :some_table") end it "requires `table_name` or `on` to be specified" do expect do - run_generator ["test", "foo" => "some_table"] + run_generator( + Fx::Generators::TriggerGenerator, + ["test", {"foo" => "some_table"}] + ) end.to raise_error(ArgumentError) end @@ -49,11 +62,14 @@ migration = file("db/migrate/update_trigger_test_to_version_2.rb") trigger_definition = file("db/triggers/test_v02.sql") - run_generator ["test", "table_name" => "some_table"] + run_generator( + Fx::Generators::TriggerGenerator, + ["test", {"table_name" => "some_table"}] + ) expect(trigger_definition).to exist - expect(migration).to be_a_migration - expect(migration_file(migration)).to contain("UpdateTriggerTestToVersion2") - expect(migration_file(migration)).to contain("on: :some_table") + expect_to_be_a_migration(migration) + expect(migration_content(migration)).to include("UpdateTriggerTestToVersion2") + expect(migration_content(migration)).to include("on: :some_table") end end diff --git a/spec/support/generator_setup.rb b/spec/support/generator_setup.rb index 6ef9b0df..7f7619bb 100644 --- a/spec/support/generator_setup.rb +++ b/spec/support/generator_setup.rb @@ -1,11 +1,49 @@ -require "ammeter/init" +module GeneratorSetup + RAILS_ROOT = File.expand_path("../../../tmp/dummy", __dir__) + MIGRATION_TIMESTAMP_PATTERN = /\d+_/ + + def run_generator(generator_class, args = [], options = {}) + silence_stream($stdout) do + allow(Rails).to receive(:root).and_return(Pathname.new(RAILS_ROOT)) + generator = generator_class.new(args, options, destination_root: RAILS_ROOT) + + generator.invoke_all + end + end + + def file(relative_path) + Pathname.new(File.join(RAILS_ROOT, relative_path)) + end + + def migration_content(file_path) + migration_path = find_migration_files(file_path).first + migration_path ? Pathname.new(migration_path).read : nil + end + + def find_migration_files(file_path) + directory = File.dirname(file_path) + basename = File.basename(file_path, ".rb") + Dir.glob(File.join(directory, "*#{basename}.rb")) + end + + def expect_to_be_a_migration(pathname) + migration_files = find_migration_files(pathname) + + expect(migration_files).to be_present, + "expected #{pathname} to be a migration file" + first_migration = migration_files.first + expect(first_migration).to match(MIGRATION_TIMESTAMP_PATTERN), + "expected #{first_migration} to have timestamp prefix (format: YYYYMMDDHHMMSS_)" + end +end RSpec.configure do |config| + config.include GeneratorSetup, :generator + config.before(:each, :generator) do - fake_rails_root = File.expand_path("../../../tmp/dummy", __FILE__) - allow(Rails).to receive(:root).and_return(Pathname.new(fake_rails_root)) + FileUtils.rm_rf(GeneratorSetup::RAILS_ROOT) if File.exist?(GeneratorSetup::RAILS_ROOT) + FileUtils.mkdir_p(GeneratorSetup::RAILS_ROOT) - destination fake_rails_root - prepare_destination + allow(Rails).to receive(:root).and_return(Pathname.new(GeneratorSetup::RAILS_ROOT)) end end From 621c3bf0574195356133bb67e1ea5b2358055545 Mon Sep 17 00:00:00 2001 From: Teo Ljungberg Date: Tue, 12 Aug 2025 15:45:50 +0200 Subject: [PATCH 2/6] Move setup outside silence_stream() --- spec/support/generator_setup.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/support/generator_setup.rb b/spec/support/generator_setup.rb index 7f7619bb..bba81459 100644 --- a/spec/support/generator_setup.rb +++ b/spec/support/generator_setup.rb @@ -3,10 +3,10 @@ module GeneratorSetup MIGRATION_TIMESTAMP_PATTERN = /\d+_/ def run_generator(generator_class, args = [], options = {}) - silence_stream($stdout) do - allow(Rails).to receive(:root).and_return(Pathname.new(RAILS_ROOT)) - generator = generator_class.new(args, options, destination_root: RAILS_ROOT) + allow(Rails).to receive(:root).and_return(Pathname.new(RAILS_ROOT)) + generator = generator_class.new(args, options, destination_root: RAILS_ROOT) + silence_stream($stdout) do generator.invoke_all end end From 209a86077b48cb8521d46d8a4caf56b5efc77eb4 Mon Sep 17 00:00:00 2001 From: Teo Ljungberg Date: Tue, 12 Aug 2025 15:46:55 +0200 Subject: [PATCH 3/6] Use early return --- spec/support/generator_setup.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/support/generator_setup.rb b/spec/support/generator_setup.rb index bba81459..bcd06e88 100644 --- a/spec/support/generator_setup.rb +++ b/spec/support/generator_setup.rb @@ -17,7 +17,9 @@ def file(relative_path) def migration_content(file_path) migration_path = find_migration_files(file_path).first - migration_path ? Pathname.new(migration_path).read : nil + return if migration_path.nil? + + Pathname.new(migration_path).read end def find_migration_files(file_path) From 9a6660aad4ae69e0767a714079271350876b69c4 Mon Sep 17 00:00:00 2001 From: Teo Ljungberg Date: Tue, 12 Aug 2025 15:48:35 +0200 Subject: [PATCH 4/6] Convert RAILS_ROOT to a Pathname --- spec/support/generator_setup.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/support/generator_setup.rb b/spec/support/generator_setup.rb index bcd06e88..5ddfe863 100644 --- a/spec/support/generator_setup.rb +++ b/spec/support/generator_setup.rb @@ -1,9 +1,9 @@ module GeneratorSetup - RAILS_ROOT = File.expand_path("../../../tmp/dummy", __dir__) + RAILS_ROOT = Pathname.new(File.expand_path("../../../tmp/dummy", __dir__)).freeze MIGRATION_TIMESTAMP_PATTERN = /\d+_/ def run_generator(generator_class, args = [], options = {}) - allow(Rails).to receive(:root).and_return(Pathname.new(RAILS_ROOT)) + allow(Rails).to receive(:root).and_return(RAILS_ROOT) generator = generator_class.new(args, options, destination_root: RAILS_ROOT) silence_stream($stdout) do @@ -12,7 +12,7 @@ def run_generator(generator_class, args = [], options = {}) end def file(relative_path) - Pathname.new(File.join(RAILS_ROOT, relative_path)) + RAILS_ROOT.join(relative_path) end def migration_content(file_path) From f3e90a6e748b773532b95cc7427801caa7c14e01 Mon Sep 17 00:00:00 2001 From: Teo Ljungberg Date: Tue, 12 Aug 2025 17:36:06 +0200 Subject: [PATCH 5/6] Harden regexp --- spec/support/generator_setup.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spec/support/generator_setup.rb b/spec/support/generator_setup.rb index 5ddfe863..a8d425fa 100644 --- a/spec/support/generator_setup.rb +++ b/spec/support/generator_setup.rb @@ -1,6 +1,6 @@ module GeneratorSetup RAILS_ROOT = Pathname.new(File.expand_path("../../../tmp/dummy", __dir__)).freeze - MIGRATION_TIMESTAMP_PATTERN = /\d+_/ + MIGRATION_TIMESTAMP_PATTERN = /\A\d{14}_/ def run_generator(generator_class, args = [], options = {}) allow(Rails).to receive(:root).and_return(RAILS_ROOT) @@ -34,8 +34,9 @@ def expect_to_be_a_migration(pathname) expect(migration_files).to be_present, "expected #{pathname} to be a migration file" first_migration = migration_files.first - expect(first_migration).to match(MIGRATION_TIMESTAMP_PATTERN), - "expected #{first_migration} to have timestamp prefix (format: YYYYMMDDHHMMSS_)" + migration_basename = File.basename(first_migration) + expect(migration_basename).to match(MIGRATION_TIMESTAMP_PATTERN), + "expected #{migration_basename} to have timestamp prefix (format: YYYYMMDDHHMMSS_)" end end From 083d867176224f0685b933b9cb2d428f58c228a6 Mon Sep 17 00:00:00 2001 From: Teo Ljungberg Date: Fri, 15 Aug 2025 14:48:53 +0200 Subject: [PATCH 6/6] Use described_class --- spec/generators/fx/function/function_generator_spec.rb | 6 +++--- spec/generators/fx/trigger/trigger_generator_spec.rb | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/spec/generators/fx/function/function_generator_spec.rb b/spec/generators/fx/function/function_generator_spec.rb index 3810ac81..92317e79 100644 --- a/spec/generators/fx/function/function_generator_spec.rb +++ b/spec/generators/fx/function/function_generator_spec.rb @@ -6,7 +6,7 @@ migration = file("db/migrate/create_function_test.rb") function_definition = file("db/functions/test_v01.sql") - run_generator(Fx::Generators::FunctionGenerator, ["test"]) + run_generator(described_class, ["test"]) expect(function_definition).to exist expect_to_be_a_migration(migration) @@ -18,7 +18,7 @@ migration = file("db/migrate/create_function_test.rb") function_definition = file("db/functions/test_v01.sql") - run_generator(Fx::Generators::FunctionGenerator, ["test"], {migration: false}) + run_generator(described_class, ["test"], {migration: false}) expect(function_definition).to exist expect(migration).not_to exist @@ -35,7 +35,7 @@ migration = file("db/migrate/update_function_test_to_version_2.rb") function_definition = file("db/functions/test_v02.sql") - run_generator(Fx::Generators::FunctionGenerator, ["test"]) + run_generator(described_class, ["test"]) expect(function_definition).to exist expect_to_be_a_migration(migration) diff --git a/spec/generators/fx/trigger/trigger_generator_spec.rb b/spec/generators/fx/trigger/trigger_generator_spec.rb index fcb62457..e467968b 100644 --- a/spec/generators/fx/trigger/trigger_generator_spec.rb +++ b/spec/generators/fx/trigger/trigger_generator_spec.rb @@ -7,7 +7,7 @@ trigger_definition = file("db/triggers/test_v01.sql") run_generator( - Fx::Generators::TriggerGenerator, + described_class, ["test", {"table_name" => "some_table"}] ) @@ -23,7 +23,7 @@ trigger_definition = file("db/triggers/test_v01.sql") run_generator( - Fx::Generators::TriggerGenerator, + described_class, ["test", {"table_name" => "some_table"}], {migration: false} ) @@ -38,7 +38,7 @@ trigger_definition = file("db/triggers/test_v01.sql") run_generator( - Fx::Generators::TriggerGenerator, + described_class, ["test", {"on" => "some_table"}] ) @@ -51,7 +51,7 @@ it "requires `table_name` or `on` to be specified" do expect do run_generator( - Fx::Generators::TriggerGenerator, + described_class, ["test", {"foo" => "some_table"}] ) end.to raise_error(ArgumentError) @@ -63,7 +63,7 @@ trigger_definition = file("db/triggers/test_v02.sql") run_generator( - Fx::Generators::TriggerGenerator, + described_class, ["test", {"table_name" => "some_table"}] )