Skip to content

Commit de68a76

Browse files
committed
Refactor Statements to use explicit keyword arguments
Changes: - `Statements`: Use explicit keyword arguments `(version:, sql_definition:, ...)` - `CommandRecorder`: Add `ruby2_keywords` markers for proper forwarding - CommandRecorder::Arguments: Use Hash.ruby2_keywords_hash for revert options The `ruby2_keywords` approach ensures keyword arguments are properly preserved when `CommandRecorder` replays migrations via `send(*args)`.
1 parent 4d87d7e commit de68a76

File tree

4 files changed

+40
-37
lines changed

4 files changed

+40
-37
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ changelog, see the [commits] for each version via the version links.
99

1010
[Unreleased]: https://github.com/teoljungberg/fx/compare/v0.10.0..HEAD
1111

12+
- Refactor Statements module to use explicit keyword arguments instead of `**options` hash
13+
- Update CommandRecorder to use `ruby2_keywords` for proper argument forwarding, following Rails' migration pattern
14+
1215
## [0.10.0]
1316

1417
[0.10.0]: https://github.com/teoljungberg/fx/compare/v0.9.0...v0.10.0

lib/fx/command_recorder.rb

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
module Fx
22
# @api private
33
module CommandRecorder
4-
def create_function(*args)
5-
record(:create_function, args)
4+
def create_function(*args, &block)
5+
record(:create_function, args, &block)
66
end
7+
ruby2_keywords :create_function if respond_to?(:ruby2_keywords, true)
78

8-
def drop_function(*args)
9-
record(:drop_function, args)
9+
def drop_function(*args, &block)
10+
record(:drop_function, args, &block)
1011
end
12+
ruby2_keywords :drop_function if respond_to?(:ruby2_keywords, true)
1113

12-
def update_function(*args)
13-
record(:update_function, args)
14+
def update_function(*args, &block)
15+
record(:update_function, args, &block)
1416
end
17+
ruby2_keywords :update_function if respond_to?(:ruby2_keywords, true)
1518

1619
def invert_create_function(args)
1720
[:drop_function, args]
@@ -25,17 +28,20 @@ def invert_update_function(args)
2528
perform_inversion(:update_function, args)
2629
end
2730

28-
def create_trigger(*args)
29-
record(:create_trigger, args)
31+
def create_trigger(*args, &block)
32+
record(:create_trigger, args, &block)
3033
end
34+
ruby2_keywords :create_trigger if respond_to?(:ruby2_keywords, true)
3135

32-
def drop_trigger(*args)
33-
record(:drop_trigger, args)
36+
def drop_trigger(*args, &block)
37+
record(:drop_trigger, args, &block)
3438
end
39+
ruby2_keywords :drop_trigger if respond_to?(:ruby2_keywords, true)
3540

36-
def update_trigger(*args)
37-
record(:update_trigger, args)
41+
def update_trigger(*args, &block)
42+
record(:update_trigger, args, &block)
3843
end
44+
ruby2_keywords :update_trigger if respond_to?(:ruby2_keywords, true)
3945

4046
def invert_create_trigger(args)
4147
[:drop_trigger, args]
@@ -93,11 +99,21 @@ def options
9399
@options ||= @args[1] || {}
94100
end
95101

102+
def keyword_hash(hash)
103+
if Hash.respond_to?(:ruby2_keywords_hash)
104+
Hash.ruby2_keywords_hash(hash)
105+
else
106+
hash
107+
end
108+
end
109+
96110
def options_for_revert
97-
options.clone.tap do |revert_options|
111+
opts = options.clone.tap do |revert_options|
98112
revert_options[:version] = revert_to_version
99113
revert_options.delete(:revert_to_version)
100114
end
115+
116+
keyword_hash(opts)
101117
end
102118
end
103119
private_constant :Arguments

lib/fx/statements.rb

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ module Statements
2626
# $$ LANGUAGE plpgsql;
2727
# SQL
2828
#
29-
def create_function(name, options = {})
30-
version = options.fetch(:version, 1)
31-
sql_definition = options[:sql_definition]
32-
29+
def create_function(name, version: 1, sql_definition: nil, revert_to_version: nil)
3330
validate_version_or_sql_definition_present!(version, sql_definition)
3431
sql_definition = resolve_sql_definition(sql_definition, name, version, :function)
3532

@@ -47,7 +44,7 @@ def create_function(name, options = {})
4744
# @example Drop a function, rolling back to version 2 on rollback
4845
# drop_function(:uppercase_users_name, revert_to_version: 2)
4946
#
50-
def drop_function(name, options = {})
47+
def drop_function(name, revert_to_version: nil)
5148
Fx.database.drop_function(name)
5249
end
5350

@@ -80,10 +77,7 @@ def drop_function(name, options = {})
8077
# $$ LANGUAGE plpgsql;
8178
# SQL
8279
#
83-
def update_function(name, options = {})
84-
version = options[:version]
85-
sql_definition = options[:sql_definition]
86-
80+
def update_function(name, version: nil, sql_definition: nil, revert_to_version: nil)
8781
validate_version_or_sql_definition_present!(version, sql_definition)
8882

8983
sql_definition = resolve_sql_definition(sql_definition, name, version, :function)
@@ -113,10 +107,7 @@ def update_function(name, options = {})
113107
# EXECUTE FUNCTION uppercase_users_name();
114108
# SQL
115109
#
116-
def create_trigger(name, options = {})
117-
version = options[:version]
118-
sql_definition = options[:sql_definition]
119-
110+
def create_trigger(name, version: nil, sql_definition: nil, on: nil, revert_to_version: nil)
120111
validate_version_and_sql_definition_exclusive!(version, sql_definition)
121112

122113
version ||= 1
@@ -139,8 +130,7 @@ def create_trigger(name, options = {})
139130
# @example Drop a trigger, rolling back to version 3 on rollback
140131
# drop_trigger(:log_inserts, on: :users, revert_to_version: 3)
141132
#
142-
def drop_trigger(name, options = {})
143-
on = options.fetch(:on)
133+
def drop_trigger(name, on:, revert_to_version: nil)
144134
Fx.database.drop_trigger(name, on: on)
145135
end
146136

@@ -176,18 +166,10 @@ def drop_trigger(name, options = {})
176166
# EXECUTE FUNCTION uppercase_users_name();
177167
# SQL
178168
#
179-
def update_trigger(name, options = {})
180-
version = options[:version]
181-
on = options[:on]
182-
sql_definition = options[:sql_definition]
183-
169+
def update_trigger(name, on:, version: nil, sql_definition: nil, revert_to_version: nil)
184170
validate_version_or_sql_definition_present!(version, sql_definition)
185171
validate_version_and_sql_definition_exclusive!(version, sql_definition)
186172

187-
if on.nil?
188-
raise ArgumentError, "on is required"
189-
end
190-
191173
sql_definition = resolve_sql_definition(sql_definition, name, version, :trigger)
192174

193175
Fx.database.update_trigger(

spec/fx/statements_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@
176176
expect do
177177
connection.update_trigger(
178178
:whatever,
179+
on: :users,
179180
version: nil,
180181
sql_definition: nil
181182
)
@@ -191,6 +192,7 @@
191192
expect do
192193
connection.update_trigger(
193194
:whatever,
195+
on: :users,
194196
version: 1,
195197
sql_definition: "a definition"
196198
)

0 commit comments

Comments
 (0)