fx 0.1.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. checksums.yaml +5 -5
  2. data/.github/scripts/check-eol +95 -0
  3. data/.github/workflows/ci.yml +61 -0
  4. data/.github/workflows/eol-check.yml +30 -0
  5. data/.rspec +1 -1
  6. data/.standard.yml +3 -0
  7. data/CHANGELOG.md +186 -0
  8. data/CONTRIBUTING.md +13 -4
  9. data/Gemfile +21 -2
  10. data/LICENSE +18 -0
  11. data/README.md +99 -14
  12. data/Rakefile +11 -1
  13. data/bin/rake +2 -3
  14. data/bin/rspec +13 -3
  15. data/bin/setup +1 -4
  16. data/bin/standardrb +27 -0
  17. data/bin/yard +13 -3
  18. data/fx.gemspec +20 -27
  19. data/lib/fx/adapters/postgres/connection.rb +6 -0
  20. data/lib/fx/adapters/postgres/functions.rb +16 -28
  21. data/lib/fx/adapters/postgres/query_executor.rb +34 -0
  22. data/lib/fx/adapters/postgres/triggers.rb +14 -28
  23. data/lib/fx/adapters/postgres.rb +30 -17
  24. data/lib/fx/command_recorder.rb +104 -13
  25. data/lib/fx/configuration.rb +10 -25
  26. data/lib/fx/definition.rb +32 -10
  27. data/lib/fx/function.rb +23 -9
  28. data/lib/fx/railtie.rb +15 -0
  29. data/lib/fx/schema_dumper.rb +33 -10
  30. data/lib/fx/statements.rb +213 -11
  31. data/lib/fx/trigger.rb +5 -3
  32. data/lib/fx/version.rb +1 -1
  33. data/lib/fx.rb +40 -0
  34. data/lib/generators/fx/function/USAGE +2 -0
  35. data/lib/generators/fx/function/function_generator.rb +54 -39
  36. data/lib/generators/fx/function/templates/db/migrate/create_function.erb +1 -1
  37. data/lib/generators/fx/function/templates/db/migrate/update_function.erb +1 -1
  38. data/lib/generators/fx/migration_helper.rb +45 -0
  39. data/lib/generators/fx/name_helper.rb +33 -0
  40. data/lib/generators/fx/trigger/USAGE +2 -0
  41. data/lib/generators/fx/trigger/templates/db/migrate/create_trigger.erb +1 -1
  42. data/lib/generators/fx/trigger/templates/db/migrate/update_trigger.erb +1 -1
  43. data/lib/generators/fx/trigger/trigger_generator.rb +46 -51
  44. data/lib/generators/fx/version_helper.rb +55 -0
  45. data/spec/acceptance/user_manages_functions_spec.rb +26 -6
  46. data/spec/acceptance/user_manages_triggers_spec.rb +11 -11
  47. data/spec/acceptance_helper.rb +17 -11
  48. data/spec/dummy/Rakefile +8 -1
  49. data/spec/dummy/bin/bundle +2 -2
  50. data/spec/dummy/bin/rails +3 -3
  51. data/spec/dummy/bin/rake +2 -2
  52. data/spec/dummy/config/application.rb +2 -0
  53. data/spec/dummy/config/database.yml +2 -0
  54. data/spec/dummy/config.ru +1 -1
  55. data/spec/features/functions/migrations_spec.rb +9 -9
  56. data/spec/features/functions/revert_spec.rb +13 -13
  57. data/spec/features/triggers/migrations_spec.rb +11 -11
  58. data/spec/features/triggers/revert_spec.rb +21 -21
  59. data/spec/fx/adapters/postgres/functions_spec.rb +40 -0
  60. data/spec/fx/adapters/postgres/query_executor_spec.rb +75 -0
  61. data/spec/fx/adapters/postgres/triggers_spec.rb +48 -0
  62. data/spec/fx/adapters/postgres_spec.rb +115 -111
  63. data/spec/fx/command_recorder_spec.rb +39 -53
  64. data/spec/fx/configuration_spec.rb +20 -9
  65. data/spec/fx/definition_spec.rb +53 -38
  66. data/spec/fx/function_spec.rb +143 -0
  67. data/spec/fx/schema_dumper_spec.rb +241 -0
  68. data/spec/fx/statements_spec.rb +219 -0
  69. data/spec/fx/trigger_spec.rb +52 -0
  70. data/spec/fx_spec.rb +28 -0
  71. data/spec/generators/fx/function/function_generator_spec.rb +22 -10
  72. data/spec/generators/fx/migration_helper_spec.rb +108 -0
  73. data/spec/generators/fx/name_helper_spec.rb +114 -0
  74. data/spec/generators/fx/trigger/trigger_generator_spec.rb +55 -20
  75. data/spec/generators/fx/version_helper_spec.rb +157 -0
  76. data/spec/spec_helper.rb +16 -4
  77. data/spec/support/database_reset.rb +24 -0
  78. data/spec/support/definition_helpers.rb +5 -9
  79. data/spec/support/generator_setup.rb +46 -5
  80. data/spec/support/migration_helpers.rb +9 -1
  81. data/spec/support/warning_helper.rb +5 -0
  82. metadata +43 -215
  83. data/.ruby-version +0 -1
  84. data/.travis.yml +0 -27
  85. data/Appraisals +0 -21
  86. data/bin/appraisal +0 -17
  87. data/gemfiles/rails40.gemfile +0 -8
  88. data/gemfiles/rails40.gemfile.lock +0 -111
  89. data/gemfiles/rails41.gemfile +0 -8
  90. data/gemfiles/rails41.gemfile.lock +0 -113
  91. data/gemfiles/rails42.gemfile +0 -8
  92. data/gemfiles/rails42.gemfile.lock +0 -130
  93. data/gemfiles/rails50.gemfile +0 -8
  94. data/gemfiles/rails50.gemfile.lock +0 -126
  95. data/lib/fx/command_recorder/arguments.rb +0 -43
  96. data/lib/fx/command_recorder/function.rb +0 -30
  97. data/lib/fx/command_recorder/trigger.rb +0 -30
  98. data/lib/fx/schema_dumper/function.rb +0 -29
  99. data/lib/fx/schema_dumper/trigger.rb +0 -29
  100. data/lib/fx/statements/function.rb +0 -105
  101. data/lib/fx/statements/trigger.rb +0 -133
  102. data/spec/fx/command_recorder/arguments_spec.rb +0 -41
  103. data/spec/fx/schema_dumper/function_spec.rb +0 -22
  104. data/spec/fx/schema_dumper/trigger_spec.rb +0 -40
  105. data/spec/fx/statements/function_spec.rb +0 -103
  106. data/spec/fx/statements/trigger_spec.rb +0 -132
@@ -1,4 +1,4 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
1
+ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
2
  def change
3
3
  create_trigger <%= formatted_name %>, on: <%= formatted_table_name %>
4
4
  end
@@ -1,4 +1,4 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
1
+ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
2
  def change
3
3
  update_trigger <%= formatted_name %>, on: <%= formatted_table_name %>, version: <%= version %>, revert_to_version: <%= previous_version %>
4
4
  end
@@ -1,36 +1,43 @@
1
1
  require "rails/generators"
2
2
  require "rails/generators/active_record"
3
+ require "generators/fx/version_helper"
4
+ require "generators/fx/migration_helper"
5
+ require "generators/fx/name_helper"
3
6
 
4
7
  module Fx
5
8
  module Generators
6
9
  # @api private
7
10
  class TriggerGenerator < Rails::Generators::NamedBase
8
11
  include Rails::Generators::Migration
12
+
9
13
  source_root File.expand_path("../templates", __FILE__)
10
14
  argument :table_name, type: :hash, required: true
11
15
 
16
+ DEFINITION_PATH = %w[db triggers].freeze
17
+
18
+ class_option :migration, type: :boolean
19
+
12
20
  def create_triggers_directory
13
- unless trigger_definition_path.exist?
14
- empty_directory(trigger_definition_path)
15
- end
21
+ return if trigger_definition_path.exist?
22
+
23
+ empty_directory(trigger_definition_path)
16
24
  end
17
25
 
18
26
  def create_trigger_definition
19
- create_file definition.path
27
+ create_file(definition.path)
20
28
  end
21
29
 
22
30
  def create_migration_file
23
- if updating_existing_trigger?
24
- migration_template(
25
- "db/migrate/update_trigger.erb",
26
- "db/migrate/update_trigger_#{file_name}_to_version_#{version}.rb"
27
- )
28
- else
29
- migration_template(
30
- "db/migrate/create_trigger.erb",
31
- "db/migrate/create_trigger_#{file_name}.rb"
32
- )
33
- end
31
+ return if migration_helper.skip_creation?
32
+
33
+ template_info = migration_helper.migration_template_info(
34
+ object_type: :trigger,
35
+ file_name: file_name,
36
+ updating_existing: version_helper.updating_existing?,
37
+ version: version_helper.current_version
38
+ )
39
+
40
+ migration_template(template_info[:template], template_info[:filename])
34
41
  end
35
42
 
36
43
  def self.next_migration_number(dir)
@@ -39,69 +46,57 @@ module Fx
39
46
 
40
47
  no_tasks do
41
48
  def previous_version
42
- @_previous_version ||= Dir.entries(trigger_definition_path).
43
- map { |name| version_regex.match(name).try(:[], "version").to_i }.
44
- max
49
+ version_helper.previous_version
45
50
  end
46
51
 
47
52
  def version
48
- @_version ||= previous_version.next
53
+ version_helper.current_version
49
54
  end
50
55
 
51
56
  def migration_class_name
52
- if updating_existing_trigger?
53
- "UpdateTrigger#{class_name}ToVersion#{version}"
57
+ if version_helper.updating_existing?
58
+ migration_helper.update_migration_class_name(
59
+ object_type: :trigger,
60
+ class_name: class_name,
61
+ version: version
62
+ )
54
63
  else
55
64
  super
56
65
  end
57
66
  end
58
67
 
59
68
  def formatted_name
60
- if singular_name.include?(".")
61
- "\"#{singular_name}\""
62
- else
63
- ":#{singular_name}"
64
- end
69
+ Fx::Generators::NameHelper.format_for_migration(singular_name)
65
70
  end
66
71
 
67
72
  def formatted_table_name
68
- name = table_name["table_name"] || table_name["on"]
69
-
70
- if name.nil?
71
- raise(
72
- ArgumentError,
73
- "Either `table_name:NAME` or `on:NAME` must be specified",
74
- )
75
- end
76
-
77
- if name.include?(".")
78
- "\"#{name}\""
79
- else
80
- ":#{name}"
81
- end
73
+ Fx::Generators::NameHelper.format_table_name_from_hash(table_name)
82
74
  end
83
75
  end
84
76
 
85
77
  private
86
78
 
87
- def version_regex
88
- /\A#{file_name}_v(?<version>\d+)\.sql\z/
79
+ def trigger_definition_path
80
+ @_trigger_definition_path ||= Rails.root.join(*DEFINITION_PATH)
89
81
  end
90
82
 
91
- def updating_existing_trigger?
92
- previous_version > 0
83
+ def version_helper
84
+ @_version_helper ||= Fx::Generators::VersionHelper.new(
85
+ file_name: file_name,
86
+ definition_path: trigger_definition_path
87
+ )
88
+ end
89
+
90
+ def migration_helper
91
+ @_migration_helper ||= Fx::Generators::MigrationHelper.new(options)
93
92
  end
94
93
 
95
94
  def definition
96
- Fx::Definition.new(
97
- name: file_name,
98
- version: version,
99
- type: "trigger",
100
- )
95
+ version_helper.definition_for_version(version: version, type: :trigger)
101
96
  end
102
97
 
103
- def trigger_definition_path
104
- @_trigger_definition_path ||= Rails.root.join(*["db", "triggers"])
98
+ def updating_existing_trigger?
99
+ version_helper.updating_existing?
105
100
  end
106
101
  end
107
102
  end
@@ -0,0 +1,55 @@
1
+ module Fx
2
+ module Generators
3
+ # @api private
4
+ class VersionHelper
5
+ def initialize(file_name:, definition_path:)
6
+ @file_name = file_name
7
+ @definition_path = definition_path
8
+ end
9
+
10
+ def previous_version
11
+ @previous_version ||= existing_versions.max || 0
12
+ end
13
+
14
+ def current_version
15
+ previous_version.next
16
+ end
17
+
18
+ def updating_existing?
19
+ previous_version > 0
20
+ end
21
+
22
+ def creating_new?
23
+ previous_version == 0
24
+ end
25
+
26
+ def definition_for_version(version:, type:)
27
+ case type
28
+ when :function
29
+ Fx::Definition.function(name: file_name, version: version)
30
+ when :trigger
31
+ Fx::Definition.trigger(name: file_name, version: version)
32
+ else
33
+ raise(
34
+ ArgumentError,
35
+ "Unknown type: #{type}. Must be :function or :trigger"
36
+ )
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ VERSION_PATTERN = /v(\d+)/
43
+ private_constant :VERSION_PATTERN
44
+
45
+ attr_reader :file_name, :definition_path
46
+
47
+ def existing_versions
48
+ Dir
49
+ .glob("#{file_name}_v*.sql", base: definition_path)
50
+ .map { |file| file[VERSION_PATTERN, 1].to_i }
51
+ .compact
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,16 +1,16 @@
1
1
  require "acceptance_helper"
2
2
 
3
- describe "User manages functions" do
3
+ RSpec.describe "User manages functions" do
4
4
  it "handles simple functions" do
5
5
  successfully "rails generate fx:function test"
6
- write_function_definition "test_v01", <<~EOS
6
+ write_function_definition "test_v01", <<~SQL
7
7
  CREATE OR REPLACE FUNCTION test()
8
8
  RETURNS text AS $$
9
9
  BEGIN
10
10
  RETURN 'test';
11
11
  END;
12
12
  $$ LANGUAGE plpgsql;
13
- EOS
13
+ SQL
14
14
  successfully "rake db:migrate"
15
15
 
16
16
  result = execute("SELECT * FROM test() AS result")
@@ -19,19 +19,39 @@ describe "User manages functions" do
19
19
  successfully "rails generate fx:function test"
20
20
  verify_identical_definitions(
21
21
  "db/functions/test_v01.sql",
22
- "db/functions/test_v02.sql",
22
+ "db/functions/test_v02.sql"
23
23
  )
24
- write_function_definition "test_v02", <<~EOS
24
+ write_function_definition "test_v02", <<~SQL
25
25
  CREATE OR REPLACE FUNCTION test()
26
26
  RETURNS text AS $$
27
27
  BEGIN
28
28
  RETURN 'testest';
29
29
  END;
30
30
  $$ LANGUAGE plpgsql;
31
- EOS
31
+ SQL
32
32
  successfully "rake db:migrate"
33
33
 
34
34
  result = execute("SELECT * FROM test() AS result")
35
35
  expect(result).to eq("result" => "testest")
36
36
  end
37
+
38
+ it "handles functions with arguments" do
39
+ successfully "rails generate fx:function adder"
40
+ write_function_definition "adder_v01", <<~SQL
41
+ CREATE FUNCTION adder(x int, y int)
42
+ RETURNS int AS $$
43
+ BEGIN
44
+ RETURN $1 + $2;
45
+ END;
46
+ $$ LANGUAGE plpgsql;
47
+ SQL
48
+ successfully "rake db:migrate"
49
+
50
+ result = execute("SELECT * FROM adder(1, 2) AS result")
51
+ result["result"] = result["result"].to_i
52
+ expect(result).to eq("result" => 3)
53
+
54
+ successfully "rails destroy fx:function adder"
55
+ successfully "rake db:migrate"
56
+ end
37
57
  end
@@ -1,10 +1,10 @@
1
1
  require "acceptance_helper"
2
2
 
3
- describe "User manages triggers" do
3
+ RSpec.describe "User manages triggers" do
4
4
  it "handles simple triggers" do
5
5
  successfully "rails generate model user name:string upper_name:string"
6
6
  successfully "rails generate fx:function uppercase_users_name"
7
- write_function_definition "uppercase_users_name_v01", <<~EOS
7
+ write_function_definition "uppercase_users_name_v01", <<~SQL
8
8
  CREATE OR REPLACE FUNCTION uppercase_users_name()
9
9
  RETURNS trigger AS $$
10
10
  BEGIN
@@ -12,14 +12,14 @@ describe "User manages triggers" do
12
12
  RETURN NEW;
13
13
  END;
14
14
  $$ LANGUAGE plpgsql;
15
- EOS
15
+ SQL
16
16
  successfully "rails generate fx:trigger uppercase_users_name table_name:users"
17
- write_trigger_definition "uppercase_users_name_v01", <<~EOS
17
+ write_trigger_definition "uppercase_users_name_v01", <<~SQL
18
18
  CREATE TRIGGER uppercase_users_name
19
19
  BEFORE INSERT ON users
20
20
  FOR EACH ROW
21
- EXECUTE PROCEDURE uppercase_users_name();
22
- EOS
21
+ EXECUTE FUNCTION uppercase_users_name();
22
+ SQL
23
23
  successfully "rake db:migrate"
24
24
 
25
25
  execute <<~SQL
@@ -32,18 +32,18 @@ describe "User manages triggers" do
32
32
  expect(result).to eq("upper_name" => "BOB")
33
33
 
34
34
  successfully "rails generate fx:trigger uppercase_users_name table_name:users"
35
- write_trigger_definition "uppercase_users_name_v02", <<~EOS
35
+ write_trigger_definition "uppercase_users_name_v02", <<~SQL
36
36
  CREATE TRIGGER uppercase_users_name
37
37
  BEFORE UPDATE ON users
38
38
  FOR EACH ROW
39
- EXECUTE PROCEDURE uppercase_users_name();
40
- EOS
39
+ EXECUTE FUNCTION uppercase_users_name();
40
+ SQL
41
41
  successfully "rake db:migrate"
42
- execute <<~EOS
42
+ execute <<~SQL
43
43
  UPDATE users
44
44
  SET name = 'Alice'
45
45
  WHERE id = 1;
46
- EOS
46
+ SQL
47
47
 
48
48
  result = execute("SELECT upper_name FROM users WHERE name = 'Alice';")
49
49
  expect(result).to eq("upper_name" => "ALICE")
@@ -5,29 +5,35 @@ ENV["RAILS_ENV"] = "test"
5
5
  RSpec.configure do |config|
6
6
  config.around(:each) do |example|
7
7
  Dir.chdir("spec/dummy") do
8
+ DatabaseReset.call
9
+
8
10
  example.run
11
+
12
+ DatabaseReset.call
9
13
  end
10
14
  end
11
15
 
12
16
  config.before(:suite) do
13
17
  Dir.chdir("spec/dummy") do
14
- system <<-CMD
15
- git init 1>/dev/null &&
16
- git add -A &&
17
- git commit --no-gpg-sign --message 'initial' 1>/dev/null
18
- CMD
18
+ system [
19
+ "git init -b master 1>/dev/null",
20
+ "git config user.email 'fx@example.com'",
21
+ "git config user.name 'Fx'",
22
+ "git add -A",
23
+ "git commit --no-gpg-sign --message 'initial' 1>/dev/null"
24
+ ].join(" && ")
19
25
  end
20
26
  end
21
27
 
22
28
  config.after(:suite) do
23
29
  Dir.chdir("spec/dummy") do
24
30
  ActiveRecord::Base.connection.disconnect!
25
- system <<-CMD
26
- rake db:drop db:create &&
27
- git add -A &&
28
- git reset --hard HEAD 1>/dev/null &&
29
- rm -rf .git/ 1>/dev/null
30
- CMD
31
+ DatabaseReset.call
32
+ system [
33
+ "git add -A",
34
+ "git reset --hard HEAD 1>/dev/null",
35
+ "rm -rf .git/ 1>/dev/null"
36
+ ].join(" && ")
31
37
  end
32
38
  end
33
39
 
data/spec/dummy/Rakefile CHANGED
@@ -1,6 +1,13 @@
1
1
  # Add your own tasks in files placed in lib/tasks ending in .rake,
2
2
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
3
 
4
- require File.expand_path('../config/application', __FILE__)
4
+ require File.expand_path("../config/application", __FILE__)
5
5
 
6
6
  Rails.application.load_tasks
7
+
8
+ unless Rake::Task.task_defined?("db:environment:set")
9
+ desc "dummy task for rails versions where this task does not exist"
10
+ task "db:environment:set" do
11
+ # no-op
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
- load Gem.bin_path('bundler', 'bundle')
2
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
3
+ load Gem.bin_path("bundler", "bundle")
data/spec/dummy/bin/rails CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- APP_PATH = File.expand_path('../../config/application', __FILE__)
3
- require_relative '../config/boot'
4
- require 'rails/commands'
2
+ APP_PATH = File.expand_path("../../config/application", __FILE__)
3
+ require_relative "../config/boot"
4
+ require "rails/commands"
data/spec/dummy/bin/rake CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- require_relative '../config/boot'
3
- require 'rake'
2
+ require_relative "../config/boot"
3
+ require "rake"
4
4
  Rake.application.run
@@ -11,5 +11,7 @@ module Dummy
11
11
  config.cache_classes = true
12
12
  config.eager_load = false
13
13
  config.active_support.deprecation = :stderr
14
+
15
+ config.load_defaults 7.2
14
16
  end
15
17
  end
@@ -1,5 +1,7 @@
1
1
  development: &default
2
2
  adapter: postgresql
3
+ host: 127.0.0.1
4
+ user: <%= ENV['POSTGRES_USER'] %>
3
5
  database: dummy_development
4
6
  encoding: unicode
5
7
  pool: 5
data/spec/dummy/config.ru CHANGED
@@ -1,4 +1,4 @@
1
1
  # This file is used by Rack-based servers to start the application.
2
2
 
3
- require ::File.expand_path('../config/environment', __FILE__)
3
+ require ::File.expand_path("../config/environment", __FILE__)
4
4
  run Rails.application
@@ -1,22 +1,22 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Function migrations", :db do
3
+ RSpec.describe "Function migrations", :db do
4
4
  around do |example|
5
- sql_definition = <<~EOS
5
+ sql_definition = <<~SQL
6
6
  CREATE OR REPLACE FUNCTION test()
7
7
  RETURNS text AS $$
8
8
  BEGIN
9
9
  RETURN 'test';
10
10
  END;
11
11
  $$ LANGUAGE plpgsql;
12
- EOS
12
+ SQL
13
13
  with_function_definition(name: :test, sql_definition: sql_definition) do
14
14
  example.run
15
15
  end
16
16
  end
17
17
 
18
18
  it "can run migrations that create functions" do
19
- migration = Class.new(ActiveRecord::Migration) do
19
+ migration = Class.new(migration_class) do
20
20
  def up
21
21
  create_function :test
22
22
  end
@@ -28,7 +28,7 @@ describe "Function migrations", :db do
28
28
  it "can run migrations that drop functions" do
29
29
  connection.create_function(:test)
30
30
 
31
- migration = Class.new(ActiveRecord::Migration) do
31
+ migration = Class.new(migration_class) do
32
32
  def up
33
33
  drop_function :test
34
34
  end
@@ -40,20 +40,20 @@ describe "Function migrations", :db do
40
40
  it "can run migrations that updates functions" do
41
41
  connection.create_function(:test)
42
42
 
43
- sql_definition = <<~EOS
43
+ sql_definition = <<~SQL
44
44
  CREATE OR REPLACE FUNCTION test()
45
45
  RETURNS text AS $$
46
46
  BEGIN
47
47
  RETURN 'testest';
48
48
  END;
49
49
  $$ LANGUAGE plpgsql;
50
- EOS
50
+ SQL
51
51
  with_function_definition(
52
52
  name: :test,
53
53
  version: 2,
54
- sql_definition: sql_definition,
54
+ sql_definition: sql_definition
55
55
  ) do
56
- migration = Class.new(ActiveRecord::Migration) do
56
+ migration = Class.new(migration_class) do
57
57
  def change
58
58
  update_function :test, version: 2, revert_to_version: 1
59
59
  end
@@ -1,22 +1,22 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Reverting migrations", :db do
3
+ RSpec.describe "Reverting migrations", :db do
4
4
  around do |example|
5
- sql_definition = <<~EOS
5
+ sql_definition = <<~SQL
6
6
  CREATE OR REPLACE FUNCTION test()
7
7
  RETURNS text AS $$
8
8
  BEGIN
9
9
  RETURN 'test';
10
10
  END;
11
11
  $$ LANGUAGE plpgsql;
12
- EOS
12
+ SQL
13
13
  with_function_definition(name: :test, sql_definition: sql_definition) do
14
14
  example.run
15
15
  end
16
16
  end
17
17
 
18
18
  it "can run reversible migrations for creating functions" do
19
- migration = Class.new(ActiveRecord::Migration) do
19
+ migration = Class.new(migration_class) do
20
20
  def change
21
21
  create_function :test
22
22
  end
@@ -28,42 +28,42 @@ describe "Reverting migrations", :db do
28
28
  it "can run reversible migrations for dropping functions" do
29
29
  connection.create_function(:test)
30
30
 
31
- good_migration = Class.new(ActiveRecord::Migration) do
31
+ good_migration = Class.new(migration_class) do
32
32
  def change
33
33
  drop_function :test, revert_to_version: 1
34
34
  end
35
35
  end
36
- bad_migration = Class.new(ActiveRecord::Migration) do
36
+ bad_migration = Class.new(migration_class) do
37
37
  def change
38
38
  drop_function :test
39
39
  end
40
40
  end
41
41
 
42
42
  expect { run_migration(good_migration, [:up, :down]) }.not_to raise_error
43
- expect { run_migration(bad_migration, [:up, :down]) }.
44
- to raise_error(
43
+ expect { run_migration(bad_migration, [:up, :down]) }
44
+ .to raise_error(
45
45
  ActiveRecord::IrreversibleMigration,
46
- /`create_function` is reversible only if given a `revert_to_version`/,
46
+ /`create_function` is reversible only if given a `revert_to_version`/
47
47
  )
48
48
  end
49
49
 
50
50
  it "can run reversible migrations for updating functions" do
51
51
  connection.create_function(:test)
52
52
 
53
- sql_definition = <<~EOS
53
+ sql_definition = <<~SQL
54
54
  CREATE OR REPLACE FUNCTION test()
55
55
  RETURNS text AS $$
56
56
  BEGIN
57
57
  RETURN 'bar';
58
58
  END;
59
59
  $$ LANGUAGE plpgsql;
60
- EOS
60
+ SQL
61
61
  with_function_definition(
62
62
  name: :test,
63
63
  version: 2,
64
- sql_definition: sql_definition,
64
+ sql_definition: sql_definition
65
65
  ) do
66
- migration = Class.new(ActiveRecord::Migration) do
66
+ migration = Class.new(migration_class) do
67
67
  def change
68
68
  update_function :test, version: 2, revert_to_version: 1
69
69
  end
@@ -1,15 +1,15 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Trigger migrations", :db do
3
+ RSpec.describe "Trigger migrations", :db do
4
4
  around do |example|
5
- connection.execute <<~EOS
5
+ connection.execute <<~SQL
6
6
  CREATE TABLE users (
7
7
  id int PRIMARY KEY,
8
8
  name varchar(256),
9
9
  upper_name varchar(256)
10
10
  );
11
- EOS
12
- Fx.database.create_function <<~EOS
11
+ SQL
12
+ Fx.database.create_function <<~SQL
13
13
  CREATE OR REPLACE FUNCTION uppercase_users_name()
14
14
  RETURNS trigger AS $$
15
15
  BEGIN
@@ -17,23 +17,23 @@ describe "Trigger migrations", :db do
17
17
  RETURN NEW;
18
18
  END;
19
19
  $$ LANGUAGE plpgsql;
20
- EOS
21
- sql_definition = <<~EOS
20
+ SQL
21
+ sql_definition = <<~SQL
22
22
  CREATE TRIGGER uppercase_users_name
23
23
  BEFORE INSERT ON users
24
24
  FOR EACH ROW
25
- EXECUTE PROCEDURE uppercase_users_name();
26
- EOS
25
+ EXECUTE FUNCTION uppercase_users_name();
26
+ SQL
27
27
  with_trigger_definition(
28
28
  name: :uppercase_users_name,
29
- sql_definition: sql_definition,
29
+ sql_definition: sql_definition
30
30
  ) do
31
31
  example.run
32
32
  end
33
33
  end
34
34
 
35
35
  it "can run migrations that create triggers" do
36
- migration = Class.new(ActiveRecord::Migration) do
36
+ migration = Class.new(migration_class) do
37
37
  def up
38
38
  create_trigger :uppercase_users_name
39
39
  end
@@ -45,7 +45,7 @@ describe "Trigger migrations", :db do
45
45
  it "can run migrations that drop triggers" do
46
46
  connection.create_trigger(:uppercase_users_name)
47
47
 
48
- migration = Class.new(ActiveRecord::Migration) do
48
+ migration = Class.new(migration_class) do
49
49
  def up
50
50
  drop_trigger :uppercase_users_name, on: :users
51
51
  end