Skip to content

Commit 97ad78f

Browse files
committed
fixup! Extract compostable objects between Trigger and FunctionGenerator
1 parent 15d311f commit 97ad78f

File tree

10 files changed

+181
-328
lines changed

10 files changed

+181
-328
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module Fx
22
module Generators
33
# @api private
4-
class NameFormatter
4+
class NameHelper
55
def self.format_for_migration(name)
66
if name.include?(".")
77
"\"#{name}\""
@@ -22,6 +22,7 @@ def self.format_table_name_from_hash(table_hash)
2222

2323
def self.validate_and_format(name)
2424
raise ArgumentError, "Name cannot be blank" if name.blank?
25+
2526
format_for_migration(name)
2627
end
2728
end

lib/fx/generators/path_helper.rb

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
module Fx
22
module Generators
33
# @api private
4-
class VersionCalculator
4+
class VersionHelper
55
def initialize(file_name, definition_path)
66
@file_name = file_name
77
@definition_path = definition_path
88
end
99

1010
def previous_version
11-
@_previous_version ||= calculate_previous_version
11+
@previous_version ||= existing_versions.max || 0
1212
end
1313

1414
def current_version
15-
@_current_version ||= previous_version.next
15+
previous_version.next
1616
end
1717

1818
def updating_existing?
@@ -23,10 +23,6 @@ def creating_new?
2323
previous_version == 0
2424
end
2525

26-
def version_glob_pattern
27-
"#{file_name}_v*.sql"
28-
end
29-
3026
def definition_for_version(version, type)
3127
case type
3228
when :function
@@ -40,22 +36,15 @@ def definition_for_version(version, type)
4036

4137
private
4238

39+
VERSION_PATTERN = /v(\d+)/
40+
4341
attr_reader :file_name, :definition_path
4442

45-
def calculate_previous_version
46-
Dir.glob(version_glob_pattern, base: definition_path)
47-
.map { |filename| extract_version_from_filename(filename) }
43+
def existing_versions
44+
Dir
45+
.glob("#{file_name}_v*.sql", base: definition_path)
46+
.map { |f| f[VERSION_PATTERN, 1].to_i }
4847
.compact
49-
.max || 0
50-
end
51-
52-
def extract_version_from_filename(filename)
53-
match = filename.match(version_regex)
54-
match ? match["version"].to_i : nil
55-
end
56-
57-
def version_regex
58-
/\A#{Regexp.escape(file_name)}_v(?<version>\d+)\.sql\z/
5948
end
6049
end
6150
end

lib/generators/fx/function/function_generator.rb

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
require "rails/generators"
22
require "rails/generators/active_record"
3-
require "fx/generators/version_calculator"
3+
require "fx/generators/version_helper"
44
require "fx/generators/migration_helper"
5-
require "fx/generators/name_formatter"
6-
require "fx/generators/path_helper"
5+
require "fx/generators/name_helper"
76

87
module Fx
98
module Generators
@@ -12,14 +11,16 @@ class FunctionGenerator < Rails::Generators::NamedBase
1211
include Rails::Generators::Migration
1312
source_root File.expand_path("../templates", __FILE__)
1413

14+
DEFINITION_PATH = %w[db functions].freeze
15+
1516
class_option :migration, type: :boolean
1617

1718
def create_functions_directory
18-
PathHelper.ensure_directory_exists(self, function_definition_path)
19+
empty_directory(function_definition_path) unless function_definition_path.exist?
1920
end
2021

2122
def create_function_definition
22-
if version_calculator.creating_new?
23+
if version_helper.creating_new?
2324
create_file definition.path
2425
else
2526
copy_file previous_definition.full_path, definition.full_path
@@ -32,8 +33,8 @@ def create_migration_file
3233
template_info = migration_helper.migration_template_info(
3334
:function,
3435
file_name,
35-
version_calculator.updating_existing?,
36-
version_calculator.current_version
36+
version_helper.updating_existing?,
37+
version_helper.current_version
3738
)
3839

3940
migration_template(template_info[:template], template_info[:filename])
@@ -45,15 +46,15 @@ def self.next_migration_number(dir)
4546

4647
no_tasks do
4748
def previous_version
48-
version_calculator.previous_version
49+
version_helper.previous_version
4950
end
5051

5152
def version
52-
version_calculator.current_version
53+
version_helper.current_version
5354
end
5455

5556
def migration_class_name
56-
if version_calculator.updating_existing?
57+
if version_helper.updating_existing?
5758
migration_helper.update_migration_class_name(:function, class_name, version)
5859
else
5960
super
@@ -65,38 +66,38 @@ def activerecord_migration_class
6566
end
6667

6768
def formatted_name
68-
NameFormatter.format_for_migration(singular_name)
69+
NameHelper.format_for_migration(singular_name)
6970
end
7071
end
7172

7273
private
7374

7475
def function_definition_path
75-
@_function_definition_path ||= PathHelper.definition_path_for(:function)
76+
@_function_definition_path ||= Rails.root.join(*DEFINITION_PATH)
7677
end
7778

78-
def version_calculator
79-
@_version_calculator ||= VersionCalculator.new(file_name, function_definition_path)
79+
def version_helper
80+
@_version_helper ||= VersionHelper.new(file_name, function_definition_path)
8081
end
8182

8283
def migration_helper
8384
@_migration_helper ||= MigrationHelper.new(options)
8485
end
8586

8687
def definition
87-
version_calculator.definition_for_version(version, :function)
88+
version_helper.definition_for_version(version, :function)
8889
end
8990

9091
def previous_definition
91-
version_calculator.definition_for_version(previous_version, :function)
92+
version_helper.definition_for_version(previous_version, :function)
9293
end
9394

9495
def updating_existing_function?
95-
version_calculator.updating_existing?
96+
version_helper.updating_existing?
9697
end
9798

9899
def creating_new_function?
99-
version_calculator.creating_new?
100+
version_helper.creating_new?
100101
end
101102
end
102103
end

lib/generators/fx/trigger/trigger_generator.rb

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
require "rails/generators"
22
require "rails/generators/active_record"
3-
require "fx/generators/version_calculator"
3+
require "fx/generators/version_helper"
44
require "fx/generators/migration_helper"
5-
require "fx/generators/name_formatter"
6-
require "fx/generators/path_helper"
5+
require "fx/generators/name_helper"
76

87
module Fx
98
module Generators
@@ -13,10 +12,12 @@ class TriggerGenerator < Rails::Generators::NamedBase
1312
source_root File.expand_path("../templates", __FILE__)
1413
argument :table_name, type: :hash, required: true
1514

15+
DEFINITION_PATH = %w[db triggers].freeze
16+
1617
class_option :migration, type: :boolean
1718

1819
def create_triggers_directory
19-
PathHelper.ensure_directory_exists(self, trigger_definition_path)
20+
empty_directory(trigger_definition_path) unless trigger_definition_path.exist?
2021
end
2122

2223
def create_trigger_definition
@@ -29,8 +30,8 @@ def create_migration_file
2930
template_info = migration_helper.migration_template_info(
3031
:trigger,
3132
file_name,
32-
version_calculator.updating_existing?,
33-
version_calculator.current_version
33+
version_helper.updating_existing?,
34+
version_helper.current_version
3435
)
3536

3637
migration_template(template_info[:template], template_info[:filename])
@@ -42,15 +43,15 @@ def self.next_migration_number(dir)
4243

4344
no_tasks do
4445
def previous_version
45-
version_calculator.previous_version
46+
version_helper.previous_version
4647
end
4748

4849
def version
49-
version_calculator.current_version
50+
version_helper.current_version
5051
end
5152

5253
def migration_class_name
53-
if version_calculator.updating_existing?
54+
if version_helper.updating_existing?
5455
migration_helper.update_migration_class_name(:trigger, class_name, version)
5556
else
5657
super
@@ -62,34 +63,34 @@ def activerecord_migration_class
6263
end
6364

6465
def formatted_name
65-
NameFormatter.format_for_migration(singular_name)
66+
NameHelper.format_for_migration(singular_name)
6667
end
6768

6869
def formatted_table_name
69-
NameFormatter.format_table_name_from_hash(table_name)
70+
NameHelper.format_table_name_from_hash(table_name)
7071
end
7172
end
7273

7374
private
7475

7576
def trigger_definition_path
76-
@_trigger_definition_path ||= PathHelper.definition_path_for(:trigger)
77+
@_trigger_definition_path ||= Rails.root.join(*DEFINITION_PATH)
7778
end
7879

79-
def version_calculator
80-
@_version_calculator ||= VersionCalculator.new(file_name, trigger_definition_path)
80+
def version_helper
81+
@_version_helper ||= VersionHelper.new(file_name, trigger_definition_path)
8182
end
8283

8384
def migration_helper
8485
@_migration_helper ||= MigrationHelper.new(options)
8586
end
8687

8788
def definition
88-
version_calculator.definition_for_version(version, :trigger)
89+
version_helper.definition_for_version(version, :trigger)
8990
end
9091

9192
def updating_existing_trigger?
92-
version_calculator.updating_existing?
93+
version_helper.updating_existing?
9394
end
9495
end
9596
end

spec/fx/generators/migration_helper_spec.rb

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,6 @@
5858

5959
expect(helper.activerecord_migration_class).to eq("ActiveRecord::Migration")
6060
end
61-
62-
it "memoizes the result" do
63-
allow(ActiveRecord::Migration).to receive(:respond_to?)
64-
.with(:current_version)
65-
.and_return(true)
66-
allow(ActiveRecord::Migration).to receive(:current_version)
67-
.and_return(6.1)
68-
69-
helper = described_class.new({})
70-
71-
first_call = helper.activerecord_migration_class
72-
second_call = helper.activerecord_migration_class
73-
74-
expect(first_call).to eq(second_call)
75-
expect(ActiveRecord::Migration).to have_received(:respond_to?).once
76-
end
7761
end
7862

7963
describe "#update_migration_class_name" do
Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require "spec_helper"
2-
require "fx/generators/name_formatter"
2+
require "fx/generators/name_helper"
33

4-
RSpec.describe Fx::Generators::NameFormatter do
4+
RSpec.describe Fx::Generators::NameHelper do
55
describe ".format_for_migration" do
66
it "returns symbol format for simple names" do
77
result = described_class.format_for_migration("simple_name")
@@ -104,17 +104,5 @@
104104
described_class.validate_and_format("")
105105
}.to raise_error(ArgumentError, "Name cannot be blank")
106106
end
107-
108-
it "raises error for nil names" do
109-
expect {
110-
described_class.validate_and_format(nil)
111-
}.to raise_error(ArgumentError, "Name cannot be blank")
112-
end
113-
114-
it "raises error for whitespace-only names" do
115-
expect {
116-
described_class.validate_and_format(" ")
117-
}.to raise_error(ArgumentError, "Name cannot be blank")
118-
end
119107
end
120108
end

0 commit comments

Comments
 (0)