fx 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +2 -7
  3. data/CHANGELOG.md +124 -0
  4. data/CONTRIBUTING.md +3 -3
  5. data/Gemfile +12 -1
  6. data/README.md +2 -0
  7. data/bin/standardrb +27 -0
  8. data/fx.gemspec +10 -15
  9. data/lib/fx/adapters/postgres/connection.rb +12 -0
  10. data/lib/fx/adapters/postgres/functions.rb +3 -3
  11. data/lib/fx/adapters/postgres/triggers.rb +3 -3
  12. data/lib/fx/adapters/postgres.rb +6 -14
  13. data/lib/fx/command_recorder.rb +87 -6
  14. data/lib/fx/configuration.rb +0 -25
  15. data/lib/fx/definition.rb +16 -6
  16. data/lib/fx/function.rb +3 -3
  17. data/lib/fx/schema_dumper.rb +45 -5
  18. data/lib/fx/statements.rb +228 -6
  19. data/lib/fx/trigger.rb +3 -3
  20. data/lib/fx/version.rb +1 -1
  21. data/lib/fx.rb +30 -12
  22. data/lib/generators/fx/function/function_generator.rb +2 -2
  23. data/lib/generators/fx/trigger/trigger_generator.rb +1 -5
  24. data/spec/acceptance/user_manages_functions_spec.rb +4 -4
  25. data/spec/acceptance/user_manages_triggers_spec.rb +6 -6
  26. data/spec/acceptance_helper.rb +2 -2
  27. data/spec/dummy/config/application.rb +5 -1
  28. data/spec/features/functions/migrations_spec.rb +3 -3
  29. data/spec/features/functions/revert_spec.rb +3 -3
  30. data/spec/features/triggers/migrations_spec.rb +4 -4
  31. data/spec/features/triggers/revert_spec.rb +5 -5
  32. data/spec/fx/adapters/postgres/functions_spec.rb +26 -30
  33. data/spec/fx/adapters/postgres/triggers_spec.rb +34 -38
  34. data/spec/fx/adapters/postgres_spec.rb +107 -109
  35. data/spec/fx/command_recorder_spec.rb +27 -25
  36. data/spec/fx/configuration_spec.rb +20 -9
  37. data/spec/fx/definition_spec.rb +27 -35
  38. data/spec/fx/function_spec.rb +45 -48
  39. data/spec/fx/schema_dumper_spec.rb +123 -0
  40. data/spec/fx/statements_spec.rb +217 -0
  41. data/spec/fx/trigger_spec.rb +37 -40
  42. data/spec/fx_spec.rb +28 -0
  43. data/spec/generators/fx/function/function_generator_spec.rb +3 -3
  44. data/spec/generators/fx/trigger/trigger_generator_spec.rb +10 -10
  45. data/spec/spec_helper.rb +5 -0
  46. data/spec/support/definition_helpers.rb +2 -6
  47. data/spec/support/warning_helper.rb +5 -0
  48. metadata +21 -163
  49. data/lib/fx/command_recorder/arguments.rb +0 -43
  50. data/lib/fx/command_recorder/function.rb +0 -30
  51. data/lib/fx/command_recorder/trigger.rb +0 -30
  52. data/lib/fx/schema_dumper/function.rb +0 -38
  53. data/lib/fx/schema_dumper/trigger.rb +0 -29
  54. data/lib/fx/statements/function.rb +0 -113
  55. data/lib/fx/statements/trigger.rb +0 -144
  56. data/spec/fx/command_recorder/arguments_spec.rb +0 -41
  57. data/spec/fx/schema_dumper/function_spec.rb +0 -78
  58. data/spec/fx/schema_dumper/trigger_spec.rb +0 -40
  59. data/spec/fx/statements/function_spec.rb +0 -103
  60. data/spec/fx/statements/trigger_spec.rb +0 -132
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bfa4dae8b8e550ee4ddc34b4d0d78c50cc085d01662993f0874f804525fdd51f
4
- data.tar.gz: 6e57a6df8b97e7638de3b05d9204c4bdcf2db90b585dfb617a1c2e3492d9f8b5
3
+ metadata.gz: a1eaca24d4bb2262d766c845df89e92051c4824b6cf621714d4786a6b1f2eaaf
4
+ data.tar.gz: 32b2aaf58fbb8844adf514d5b3e15bf924bcc47d69f048135579cb002c15581b
5
5
  SHA512:
6
- metadata.gz: c4cf689e5a1847b7ad45b2679dd45046555f750fb7bc8ed9dc2c473da1e6a6eba344a312fa0b33852197ec7c5d81dc92a3ff416939ba8f5435f8a5da16c928df
7
- data.tar.gz: 1d59049f9bb409bcbb56c3126f9675f1492e0a3d434858d2cb44af8a3d5aba74ee1fe5f78bbc73bab707aae05cfe8d8ed671a4a7e5dc8fa4841df176ebd88c30
6
+ metadata.gz: 0fffacf063521bd38e8f4343c4879b8872b9a750a50d278b90fc08434ca6fe6bfdaad7d79f96349b042d1fa0145f5254294d44b38cc0ca72d5516c8a08c023e7
7
+ data.tar.gz: 41c966c110817c920c4280f7a83ebfac59687cb98f0603bdf11fecd368332172441f6c1e428f364b1dfc7b7552fa896b82489979a1e2f5744b6b20c9c8e406ee
@@ -14,14 +14,9 @@ jobs:
14
14
  strategy:
15
15
  fail-fast: false
16
16
  matrix:
17
- ruby: ["2.7", "3.0", "3.1", "3.2"]
18
- rails: ["6.0", "6.1", "7.0"]
17
+ ruby: ["3.0", "3.1", "3.2", "3.3", "3.4.0-preview2"]
18
+ rails: ["7.0", "7.1", "7.2", "8.0.0"]
19
19
  continue-on-error: [false]
20
- exclude:
21
- - ruby: "3.2"
22
- rails: "6.0"
23
- - ruby: "3.2"
24
- rails: "6.1"
25
20
 
26
21
  services:
27
22
  postgres:
data/CHANGELOG.md ADDED
@@ -0,0 +1,124 @@
1
+ # Changelog
2
+
3
+ The noteworthy changes for each version are included here. For a complete
4
+ changelog, see the [commits] for each version via the version links.
5
+
6
+ [commits]: https://github.com/teoljungberg/fx/commits/master
7
+
8
+ ## [Unreleased]
9
+
10
+ [Unreleased]: https://github.com/teoljungberg/fx/compare/v0.8.0..HEAD
11
+
12
+ ## [0.9.0]
13
+
14
+ [0.9.0]: https://github.com/teoljungberg/fx/compare/v0.8.0...v0.9.0
15
+
16
+ - Drop EOL Rails versions (6.2)
17
+ - Add Ruby 3.4.0 preview's to the test matrix (#152)
18
+ - Add Rails 8.0.0 to the test matrix (#152)
19
+ - Add Rails 7.2 to the test matrix (#150)
20
+ - Fix deprecation warnings in Rails (#148)
21
+ - Mark `Fx::CommandRecorder::Arguments` as private.
22
+ - Add Ruby 3.3 to the test matrix (#144)
23
+ - Internal refactorings:
24
+ - Move development dependencies to Gemfile (#145)
25
+ - Inline `Fx::CommandRecorder::Arguments`
26
+ - Inline `Fx::{CommandRecorder,SchemaDumper,Statements}::{Function,Trigger}`
27
+ - Move configuration methods to `Fx`
28
+ - Add `Fx::Definition.{function,trigger}` (#119)
29
+ - Add Rails 7.1 to the test matrix (#136)
30
+ - Add Rubygems metadata to gemspec (#132)
31
+ - Disable RSpec's monkey patching (#121)
32
+ - Raise on warnings (#124)
33
+ - Require Ruby >= 3.0 (#128)
34
+ - Require Rails >= 6.1 (#127)
35
+
36
+ ## [0.8.0]
37
+
38
+ [0.8.0]: https://github.com/teoljungberg/fx/compare/v0.7.0...v0.8.0
39
+
40
+ - Replace Travis CI with GitHub Actions.
41
+ - Bump minimum Ruby version to 2.7.
42
+ - Ruby 2.7 will be dropped in end of March 2023, so a release to drop it will
43
+ happen afterwards.
44
+ - Bump minimum Rails version to 6.0.0
45
+ - Rails 6.0 will be dropped in June 2023, so a release to drop it will happen
46
+ afterwards
47
+ - Adopt standard.rb
48
+ - Contributing improvements
49
+ - Test-suite improvements
50
+
51
+ ## [0.7.0]
52
+
53
+ [0.7.0]: https://github.com/teoljungberg/fx/compare/v0.6.2...v0.7.0
54
+
55
+ - Support Ruby 3 (#76)
56
+ - Preserve backslashes when dumping the schema (#71)
57
+ - Add a link to F(x) SqlServer Adapter in the README (#80)
58
+
59
+ ## [0.6.2]
60
+
61
+ [0.6.2]: https://github.com/teoljungberg/fx/compare/v0.6.1...v0.6.2
62
+
63
+ - Add support for Ruby 3
64
+
65
+ ## [0.6.1]
66
+
67
+ [0.6.1]: https://github.com/teoljungberg/fx/compare/v0.6.0...v0.6.1
68
+
69
+ - Fix: Support --no-migration generator flag (#62)
70
+
71
+ ## [0.6.0]
72
+
73
+ [0.6.0]: https://github.com/teoljungberg/fx/compare/v0.5.0...v0.6.0
74
+
75
+ - Support unique functions with parameters (#27)
76
+ - Use db connection provided by Rails (#49)
77
+ - Support `--no-migration` generator flag (#60)
78
+ - Use current ActiveRecord version in migrations (#59)
79
+ - Does not include aggregates when dumping schema (#50)
80
+ - Dump functions in the beginning of the schema (#53)
81
+
82
+ ## [0.5.0]
83
+
84
+ [0.5.0]: https://github.com/teoljungberg/fx/compare/v0.4.0...v0.5.0
85
+
86
+ - Drop EOL Ruby versions.
87
+ - Drop EOL Rails versions.
88
+
89
+ ## [0.4.0]
90
+
91
+ [0.4.0]: https://github.com/teoljungberg/fx/compare/v0.3.1...v0.4.0
92
+
93
+ - Add table_name to README (#15)
94
+ - Reverse function/trigger order in README (#17)
95
+ - Split up Trigger#definition test (#19)
96
+ - Find definitions in engines (#18)
97
+
98
+ ## [0.3.1]
99
+
100
+ [0.3.1]: https://github.com/teoljungberg/fx/compare/v0.3.0...v0.3.1
101
+
102
+ - Strip shared leading whitespace from sql_definitions (#13)
103
+ - Update documentation for `drop_function`
104
+ - Document `Fx::Adapters::Postgres#initialize`
105
+ - Fix test suite issues:
106
+ - Add unit test coverage for `Fx::Adapters::Triggers`
107
+ - Add unit test coverage for `Fx::Adapters::Functions`
108
+ - Add unit test coverage for `Fx::Trigger`
109
+ - Add unit test coverage for `Fx::Function`
110
+
111
+ ## [0.3.0]
112
+
113
+ [0.3.0]: https://github.com/teoljungberg/fx/compare/v0.2.0...v0.3.0
114
+
115
+ ## [0.2.0]
116
+
117
+ [0.2.0]: https://github.com/teoljungberg/fx/compare/v0.1.0...v0.2.0
118
+
119
+ ## [0.1.0]
120
+
121
+ F(x) adds methods to `ActiveRecord::Migration` to create and manage database
122
+ functions and triggers in Rails.
123
+
124
+ [0.1.0]: https://github.com/teoljungberg/fx/compare/4ccf986643d9de82038977eff8c6b1a4a716d698...v0.1.0
data/CONTRIBUTING.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # Contributing
2
2
 
3
- We love contributions from everyone. By participating in this project, you
3
+ We love contributions from everyone. By participating in this project, you
4
4
  agree to abide by our [code of conduct].
5
5
 
6
- [code of conduct]: CODE_OF_CONDUCT.md
6
+ [code of conduct]: https://thoughtbot.com/open-source-code-of-conduct
7
7
 
8
8
  ## Contributing Code
9
9
 
@@ -19,6 +19,6 @@ agree to abide by our [code of conduct].
19
19
 
20
20
  [good commit message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
21
21
 
22
- Others will give constructive feedback. This is a time for discussion and
22
+ Others will give constructive feedback. This is a time for discussion and
23
23
  improvements, and making the necessary changes will be required before we can
24
24
  merge the contribution.
data/Gemfile CHANGED
@@ -1,4 +1,15 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in fx.gemspec
4
3
  gemspec
4
+
5
+ gem "ammeter", ">= 1.1.3"
6
+ gem "bundler", ">= 1.5"
7
+ gem "database_cleaner"
8
+ gem "pg"
9
+ gem "pry"
10
+ gem "rake"
11
+ gem "redcarpet"
12
+ gem "rspec", ">= 3.3"
13
+ gem "standardrb"
14
+ gem "yard"
15
+ gem "warning"
data/README.md CHANGED
@@ -110,6 +110,8 @@ column value instead of a plain string.
110
110
 
111
111
  ## Plugins/Adapters
112
112
 
113
+ - [MySQL](https://github.com/f-mer/fx-adapters-mysql/)
114
+ - [Oracle](https://github.com/zygotecnologia/fx-oracle-adapter)
113
115
  - [SQLserver](https://github.com/tarellel/fx-sqlserver-adapter)
114
116
 
115
117
  ## Contributing
data/bin/standardrb ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'standardrb' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
12
+
13
+ bundle_binstub = File.expand_path("bundle", __dir__)
14
+
15
+ if File.file?(bundle_binstub)
16
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
17
+ load(bundle_binstub)
18
+ else
19
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21
+ end
22
+ end
23
+
24
+ require "rubygems"
25
+ require "bundler/setup"
26
+
27
+ load Gem.bin_path("standard", "standardrb")
data/fx.gemspec CHANGED
@@ -8,29 +8,24 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["Teo Ljungberg"]
9
9
  spec.email = ["teo@teoljungberg.com"]
10
10
  spec.summary = "Support for database functions and triggers in Rails migrations"
11
- spec.description = <<-DESCRIPTION
11
+ spec.description = <<~DESCRIPTION
12
12
  Adds methods to ActiveRecord::Migration to create and manage database functions
13
13
  and triggers in Rails
14
14
  DESCRIPTION
15
15
  spec.homepage = "https://github.com/teoljungberg/fx"
16
16
  spec.license = "MIT"
17
+ spec.metadata = {
18
+ "bug_tracker_uri" => "#{spec.homepage}/issues",
19
+ "changelog_uri" => "#{spec.homepage}/blob/v#{spec.version}/CHANGELOG.md",
20
+ "homepage_uri" => spec.homepage,
21
+ "source_code_uri" => spec.homepage
22
+ }
17
23
 
18
24
  spec.files = `git ls-files -z`.split("\x0")
19
25
  spec.require_paths = ["lib"]
20
26
 
21
- spec.add_development_dependency "ammeter", ">= 1.1.3"
22
- spec.add_development_dependency "bundler", ">= 1.5"
23
- spec.add_development_dependency "database_cleaner"
24
- spec.add_development_dependency "pg"
25
- spec.add_development_dependency "pry"
26
- spec.add_development_dependency "rake"
27
- spec.add_development_dependency "redcarpet"
28
- spec.add_development_dependency "rspec", ">= 3.3"
29
- spec.add_development_dependency "standardrb"
30
- spec.add_development_dependency "yard"
27
+ spec.add_dependency "activerecord", ">= 7.0"
28
+ spec.add_dependency "railties", ">= 7.0"
31
29
 
32
- spec.add_dependency "activerecord", ">= 6.0.0"
33
- spec.add_dependency "railties", ">= 6.0.0"
34
-
35
- spec.required_ruby_version = ">= 2.7"
30
+ spec.required_ruby_version = ">= 3.0"
36
31
  end
@@ -10,6 +10,18 @@ module Fx
10
10
  #
11
11
  # @api private
12
12
  class Connection < SimpleDelegator
13
+ # https://www.postgresql.org/docs/9.6/sql-dropfunction.html
14
+ # https://www.postgresql.org/docs/10/sql-dropfunction.html
15
+ def support_drop_function_without_args
16
+ pg_connection = undecorated_connection.raw_connection
17
+ pg_connection.server_version >= 10_00_00
18
+ end
19
+
20
+ private
21
+
22
+ def undecorated_connection
23
+ __getobj__
24
+ end
13
25
  end
14
26
  end
15
27
  end
@@ -8,7 +8,7 @@ module Fx
8
8
  class Functions
9
9
  # The SQL query used by F(x) to retrieve the functions considered
10
10
  # dumpable into `db/schema.rb`.
11
- FUNCTIONS_WITH_DEFINITIONS_QUERY = <<-EOS.freeze
11
+ FUNCTIONS_WITH_DEFINITIONS_QUERY = <<~EOS.freeze
12
12
  SELECT
13
13
  pp.proname AS name,
14
14
  pg_get_functiondef(pp.oid) AS definition
@@ -27,8 +27,8 @@ module Fx
27
27
  # Wraps #all as a static facade.
28
28
  #
29
29
  # @return [Array<Fx::Function>]
30
- def self.all(*args)
31
- new(*args).all
30
+ def self.all(...)
31
+ new(...).all
32
32
  end
33
33
 
34
34
  def initialize(connection)
@@ -8,7 +8,7 @@ module Fx
8
8
  class Triggers
9
9
  # The SQL query used by F(x) to retrieve the triggers considered
10
10
  # dumpable into `db/schema.rb`.
11
- TRIGGERS_WITH_DEFINITIONS_QUERY = <<-EOS.freeze
11
+ TRIGGERS_WITH_DEFINITIONS_QUERY = <<~EOS.freeze
12
12
  SELECT
13
13
  pt.tgname AS name,
14
14
  pg_get_triggerdef(pt.oid) AS definition
@@ -25,8 +25,8 @@ module Fx
25
25
  # Wraps #all as a static facade.
26
26
  #
27
27
  # @return [Array<Fx::Trigger>]
28
- def self.all(*args)
29
- new(*args).all
28
+ def self.all(...)
29
+ new(...).all
30
30
  end
31
31
 
32
32
  def initialize(connection)
@@ -69,7 +69,7 @@ module Fx
69
69
  #
70
70
  # @return [void]
71
71
  def create_function(sql_definition)
72
- execute sql_definition
72
+ execute(sql_definition)
73
73
  end
74
74
 
75
75
  # Creates a trigger in the database.
@@ -81,7 +81,7 @@ module Fx
81
81
  #
82
82
  # @return [void]
83
83
  def create_trigger(sql_definition)
84
- execute sql_definition
84
+ execute(sql_definition)
85
85
  end
86
86
 
87
87
  # Updates a function in the database.
@@ -125,10 +125,10 @@ module Fx
125
125
  #
126
126
  # @return [void]
127
127
  def drop_function(name)
128
- if support_drop_function_without_args
129
- execute "DROP FUNCTION #{name};"
128
+ if connection.support_drop_function_without_args
129
+ execute("DROP FUNCTION #{name};")
130
130
  else
131
- execute "DROP FUNCTION #{name}();"
131
+ execute("DROP FUNCTION #{name}();")
132
132
  end
133
133
  end
134
134
 
@@ -142,7 +142,7 @@ module Fx
142
142
  #
143
143
  # @return [void]
144
144
  def drop_trigger(name, on:)
145
- execute "DROP TRIGGER #{name} ON #{on};"
145
+ execute("DROP TRIGGER #{name} ON #{on};")
146
146
  end
147
147
 
148
148
  private
@@ -154,14 +154,6 @@ module Fx
154
154
  def connection
155
155
  Connection.new(connectable.connection)
156
156
  end
157
-
158
- def support_drop_function_without_args
159
- # https://www.postgresql.org/docs/9.6/sql-dropfunction.html
160
- # https://www.postgresql.org/docs/10/sql-dropfunction.html
161
-
162
- pg_connection = connectable.connection.raw_connection
163
- pg_connection.server_version >= 10_00_00
164
- end
165
157
  end
166
158
  end
167
159
  end
@@ -1,12 +1,53 @@
1
- require "fx/command_recorder/arguments"
2
- require "fx/command_recorder/function"
3
- require "fx/command_recorder/trigger"
4
-
5
1
  module Fx
6
2
  # @api private
7
3
  module CommandRecorder
8
- include Function
9
- include Trigger
4
+ def create_function(*args)
5
+ record(:create_function, args)
6
+ end
7
+
8
+ def drop_function(*args)
9
+ record(:drop_function, args)
10
+ end
11
+
12
+ def update_function(*args)
13
+ record(:update_function, args)
14
+ end
15
+
16
+ def invert_create_function(args)
17
+ [:drop_function, args]
18
+ end
19
+
20
+ def invert_drop_function(args)
21
+ perform_inversion(:create_function, args)
22
+ end
23
+
24
+ def invert_update_function(args)
25
+ perform_inversion(:update_function, args)
26
+ end
27
+
28
+ def create_trigger(*args)
29
+ record(:create_trigger, args)
30
+ end
31
+
32
+ def drop_trigger(*args)
33
+ record(:drop_trigger, args)
34
+ end
35
+
36
+ def update_trigger(*args)
37
+ record(:update_trigger, args)
38
+ end
39
+
40
+ def invert_create_trigger(args)
41
+ [:drop_trigger, args]
42
+ end
43
+
44
+ def invert_drop_trigger(args)
45
+ perform_inversion(:create_trigger, args)
46
+ end
47
+
48
+ def invert_update_trigger(args)
49
+ perform_inversion(:update_trigger, args)
50
+ end
10
51
 
11
52
  private
12
53
 
@@ -20,5 +61,45 @@ module Fx
20
61
 
21
62
  [method, arguments.invert_version.to_a]
22
63
  end
64
+
65
+ class Arguments
66
+ def initialize(args)
67
+ @args = args.freeze
68
+ end
69
+
70
+ def function
71
+ @args[0]
72
+ end
73
+
74
+ def version
75
+ options[:version]
76
+ end
77
+
78
+ def revert_to_version
79
+ options[:revert_to_version]
80
+ end
81
+
82
+ def invert_version
83
+ Arguments.new([function, options_for_revert])
84
+ end
85
+
86
+ def to_a
87
+ @args.to_a
88
+ end
89
+
90
+ private
91
+
92
+ def options
93
+ @options ||= @args[1] || {}
94
+ end
95
+
96
+ def options_for_revert
97
+ options.clone.tap do |revert_options|
98
+ revert_options[:version] = revert_to_version
99
+ revert_options.delete(:revert_to_version)
100
+ end
101
+ end
102
+ end
103
+ private_constant :Arguments
23
104
  end
24
105
  end
@@ -1,29 +1,4 @@
1
1
  module Fx
2
- # @return [Fx::Configuration] F(x)'s current configuration
3
- def self.configuration
4
- @_configuration ||= Configuration.new
5
- end
6
-
7
- # Set F(x)'s configuration
8
- #
9
- # @param config [Fx::Configuration]
10
- def self.configuration=(config)
11
- @_configuration = config
12
- end
13
-
14
- # Modify F(x)'s current configuration
15
- #
16
- # @yieldparam [Fx::Configuration] config current F(x) config
17
- # ```
18
- # Fx.configure do |config|
19
- # config.database = Fx::Adapters::Postgres
20
- # config.dump_functions_at_beginning_of_schema = true
21
- # end
22
- # ```
23
- def self.configure
24
- yield configuration
25
- end
26
-
27
2
  # F(x)'s configuration object.
28
3
  class Configuration
29
4
  # The F(x) database adapter instance to use when executing SQL.
data/lib/fx/definition.rb CHANGED
@@ -1,18 +1,28 @@
1
1
  module Fx
2
2
  # @api private
3
3
  class Definition
4
- def initialize(name:, version:, type: "function")
4
+ FUNCTION = "function".freeze
5
+ TRIGGER = "trigger".freeze
6
+
7
+ def self.function(name:, version:)
8
+ new(name: name, version: version, type: FUNCTION)
9
+ end
10
+
11
+ def self.trigger(name:, version:)
12
+ new(name: name, version: version, type: TRIGGER)
13
+ end
14
+
15
+ def initialize(name:, version:, type:)
5
16
  @name = name
6
17
  @version = version.to_i
7
18
  @type = type
8
19
  end
9
20
 
10
21
  def to_sql
11
- File.read(find_file || full_path).tap do |content|
12
- if content.empty?
13
- raise "Define #{@type} in #{path} before migrating."
14
- end
15
- end
22
+ content = File.read(find_file || full_path)
23
+ raise "Define #{@type} in #{path} before migrating." if content.empty?
24
+
25
+ content
16
26
  end
17
27
 
18
28
  def full_path
data/lib/fx/function.rb CHANGED
@@ -6,9 +6,9 @@ module Fx
6
6
  attr_reader :name, :definition
7
7
  delegate :<=>, to: :name
8
8
 
9
- def initialize(function_row)
10
- @name = function_row.fetch("name")
11
- @definition = function_row.fetch("definition")
9
+ def initialize(row)
10
+ @name = row.fetch("name")
11
+ @definition = row.fetch("definition")
12
12
  end
13
13
 
14
14
  def ==(other)
@@ -1,10 +1,50 @@
1
- require "fx/schema_dumper/function"
2
- require "fx/schema_dumper/trigger"
3
-
4
1
  module Fx
5
2
  # @api private
6
3
  module SchemaDumper
7
- include Function
8
- include Trigger
4
+ def tables(stream)
5
+ if Fx.configuration.dump_functions_at_beginning_of_schema
6
+ functions(stream)
7
+ empty_line(stream)
8
+ end
9
+
10
+ super
11
+
12
+ unless Fx.configuration.dump_functions_at_beginning_of_schema
13
+ functions(stream)
14
+ empty_line(stream)
15
+ end
16
+
17
+ triggers(stream)
18
+ end
19
+
20
+ private
21
+
22
+ def empty_line(stream)
23
+ stream.puts if dumpable_functions_in_database.any?
24
+ end
25
+
26
+ def functions(stream)
27
+ dumpable_functions_in_database.each do |function|
28
+ stream.puts(function.to_schema)
29
+ end
30
+ end
31
+
32
+ def triggers(stream)
33
+ if dumpable_triggers_in_database.any?
34
+ stream.puts
35
+ end
36
+
37
+ dumpable_triggers_in_database.each do |trigger|
38
+ stream.puts(trigger.to_schema)
39
+ end
40
+ end
41
+
42
+ def dumpable_functions_in_database
43
+ @_dumpable_functions_in_database ||= Fx.database.functions
44
+ end
45
+
46
+ def dumpable_triggers_in_database
47
+ @_dumpable_triggers_in_database ||= Fx.database.triggers
48
+ end
9
49
  end
10
50
  end