fx 0.8.0 → 0.9.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 (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