pg_spec_helper 1.5.0 → 1.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/pg_spec_helper/functions.rb +30 -0
- data/lib/pg_spec_helper/triggers.rb +78 -0
- data/lib/pg_spec_helper/version.rb +1 -1
- data/lib/pg_spec_helper.rb +4 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c885ddde22232c3907a08da5411a55e09b1105a87afbac5aac0b2b443c63ee1
|
4
|
+
data.tar.gz: a8220ca48f1dea784d20e45ecc74dfd0f464c8524a55240715bb7154dc6f8879
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08770ab6431e7b5d2f21b0443d88282400ea597d78b946fe5c68b4c4ff562ae7bd14e0ddb5db4c5353ec8954ee0472ce5e5a2858259186504469f0a6783d66df'
|
7
|
+
data.tar.gz: f811831ee0dc0381a3252556d28c1ac85f476707ab3ac6fd3c951c0c2ecb985ea7d18a1daf663d27ce533c06cab94e91d0963a200a88590bae5004a14d64b0d7
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [1.6.0](https://github.com/craigulliott/pg_spec_helper/compare/v1.5.0...v1.6.0) (2023-08-06)
|
4
|
+
|
5
|
+
|
6
|
+
### Features
|
7
|
+
|
8
|
+
* added support for triggers and functions ([f89bf5e](https://github.com/craigulliott/pg_spec_helper/commit/f89bf5e3afa6fc411e9d1f16cb62db74fc8dc987))
|
9
|
+
|
3
10
|
## [1.5.0](https://github.com/craigulliott/pg_spec_helper/compare/v1.4.0...v1.5.0) (2023-08-01)
|
4
11
|
|
5
12
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class PGSpecHelper
|
4
|
+
module Functions
|
5
|
+
# create a function
|
6
|
+
def create_function schema_name, function_name, function_definition
|
7
|
+
connection.exec <<-SQL
|
8
|
+
CREATE FUNCTION #{schema_name}.#{function_name}() returns trigger language plpgsql AS $$
|
9
|
+
BEGIN
|
10
|
+
#{function_definition};
|
11
|
+
RETURN NEW;
|
12
|
+
END $$;
|
13
|
+
SQL
|
14
|
+
end
|
15
|
+
|
16
|
+
# return a list of function names for the provided schema
|
17
|
+
def get_function_names schema_name
|
18
|
+
# get the function names
|
19
|
+
rows = connection.exec(<<-SQL, [schema_name.to_s])
|
20
|
+
SELECT
|
21
|
+
routine_name
|
22
|
+
FROM
|
23
|
+
information_schema.routines
|
24
|
+
WHERE
|
25
|
+
routine_schema = $1
|
26
|
+
SQL
|
27
|
+
rows.map { |r| r["routine_name"].to_sym }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class PGSpecHelper
|
4
|
+
module Triggers
|
5
|
+
# create a trigger
|
6
|
+
class UnexpectedEventManipulationError < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
class UnexpectedActionOrderError < StandardError
|
10
|
+
end
|
11
|
+
|
12
|
+
class UnexpectedActionStatementError < StandardError
|
13
|
+
end
|
14
|
+
|
15
|
+
class UnexpectedActionOrientationError < StandardError
|
16
|
+
end
|
17
|
+
|
18
|
+
class UnexpectedActionTimingError < StandardError
|
19
|
+
end
|
20
|
+
|
21
|
+
# create a postgres trigger
|
22
|
+
def create_trigger schema_name, table_name, name, action_timing:, event_manipulation:, action_orientation:, routine_schema:, routine_name:, action_condition: nil, action_reference_old_table: nil, action_reference_new_table: nil
|
23
|
+
unless [:insert, :delete, :update].include? event_manipulation
|
24
|
+
raise UnexpectedEventManipulationError, event_manipulation
|
25
|
+
end
|
26
|
+
|
27
|
+
unless action_condition.nil? || action_condition.is_a?(String)
|
28
|
+
raise ExpectedStringError, action_condition
|
29
|
+
end
|
30
|
+
|
31
|
+
unless [:row, :statement].include? action_orientation
|
32
|
+
raise UnexpectedActionOrientationError, action_orientation
|
33
|
+
end
|
34
|
+
|
35
|
+
unless [:before, :after].include? action_timing
|
36
|
+
raise UnexpectedActionTimingError, action_timing
|
37
|
+
end
|
38
|
+
|
39
|
+
# BEFORE INSERT / AFTER INSERT / BEFORE UPDATE / AFTER UPDATE / BEFORE DELETE / AFTER DELETE
|
40
|
+
timing_sql = "#{action_timing} #{event_manipulation}".upcase
|
41
|
+
|
42
|
+
condition_sql = action_condition.nil? ? "" : "WHEN (#{action_condition})"
|
43
|
+
|
44
|
+
temp_tables = []
|
45
|
+
unless action_reference_old_table.nil?
|
46
|
+
temp_tables << "OLD TABLE AS #{action_reference_old_table}"
|
47
|
+
end
|
48
|
+
unless action_reference_new_table.nil?
|
49
|
+
temp_tables << "NEW TABLE AS #{action_reference_new_table}"
|
50
|
+
end
|
51
|
+
temp_tables_sql = temp_tables.any? ? "REFERENCING #{temp_tables.join(" ")}" : ""
|
52
|
+
|
53
|
+
connection.exec <<-SQL
|
54
|
+
-- trigger names only need to be unique for this table
|
55
|
+
CREATE TRIGGER #{name}
|
56
|
+
#{timing_sql} ON #{schema_name}.#{table_name} #{temp_tables_sql}
|
57
|
+
FOR EACH #{action_orientation}
|
58
|
+
#{condition_sql}
|
59
|
+
EXECUTE PROCEDURE #{routine_schema}.#{routine_name}();
|
60
|
+
SQL
|
61
|
+
end
|
62
|
+
|
63
|
+
# return a list of trigger names for the provided table
|
64
|
+
def get_trigger_names schema_name, table_name
|
65
|
+
# get the trigger names
|
66
|
+
rows = connection.exec(<<-SQL, [schema_name.to_s, table_name.to_s])
|
67
|
+
SELECT
|
68
|
+
trigger_name
|
69
|
+
FROM
|
70
|
+
information_schema.triggers
|
71
|
+
WHERE
|
72
|
+
event_object_schema = $1
|
73
|
+
AND event_object_table = $2
|
74
|
+
SQL
|
75
|
+
rows.map { |r| r["trigger_name"].to_sym }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/pg_spec_helper.rb
CHANGED
@@ -16,6 +16,8 @@ require "pg_spec_helper/foreign_keys"
|
|
16
16
|
require "pg_spec_helper/unique_constraints"
|
17
17
|
require "pg_spec_helper/primary_keys"
|
18
18
|
require "pg_spec_helper/indexes"
|
19
|
+
require "pg_spec_helper/triggers"
|
20
|
+
require "pg_spec_helper/functions"
|
19
21
|
require "pg_spec_helper/models"
|
20
22
|
require "pg_spec_helper/materialized_views"
|
21
23
|
require "pg_spec_helper/reset"
|
@@ -39,6 +41,8 @@ class PGSpecHelper
|
|
39
41
|
include UniqueConstraints
|
40
42
|
include PrimaryKeys
|
41
43
|
include Indexes
|
44
|
+
include Triggers
|
45
|
+
include Functions
|
42
46
|
include Models
|
43
47
|
include MaterializedViews
|
44
48
|
include Reset
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_spec_helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Ulliott
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- lib/pg_spec_helper/connection.rb
|
56
56
|
- lib/pg_spec_helper/empty_database.rb
|
57
57
|
- lib/pg_spec_helper/foreign_keys.rb
|
58
|
+
- lib/pg_spec_helper/functions.rb
|
58
59
|
- lib/pg_spec_helper/ignored_schemas.rb
|
59
60
|
- lib/pg_spec_helper/indexes.rb
|
60
61
|
- lib/pg_spec_helper/materialized_views.rb
|
@@ -66,6 +67,7 @@ files:
|
|
66
67
|
- lib/pg_spec_helper/table_executer.rb
|
67
68
|
- lib/pg_spec_helper/tables.rb
|
68
69
|
- lib/pg_spec_helper/track_changes.rb
|
70
|
+
- lib/pg_spec_helper/triggers.rb
|
69
71
|
- lib/pg_spec_helper/unique_constraints.rb
|
70
72
|
- lib/pg_spec_helper/validations.rb
|
71
73
|
- lib/pg_spec_helper/version.rb
|