postspec 0.5.1 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/postspec/environment.rb +11 -11
- data/lib/postspec/render.rb +29 -18
- data/lib/postspec/version.rb +1 -1
- data/lib/share/postspec_schema.sql +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbef9ecda05ff7deeb013906388668f187ce267a1d173f8b66cf414fa2fbc38b
|
4
|
+
data.tar.gz: 07e283ea4dcf43f3725f6af41f776240c3ed63f537415f1fafc5e29fa5da8ccd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8218dd2502c9ba7c4db0f3ca4384a2997571bbee90f75946057ebf7b33e7f2fc6b1c0fc552084f9c1c3c02d5f3bf5f2a53c656540fd87859ef26ba8b73292364
|
7
|
+
data.tar.gz: 03ab635533126ea2fea4711925bfcd3f800344ad9ba57561e3fadbe291046413ac21b8b5d4e573156ab711215b467fbeea49c3b8afad1034bfed8ec5000d355b
|
data/lib/postspec/environment.rb
CHANGED
@@ -46,7 +46,7 @@ module Postspec
|
|
46
46
|
def create()
|
47
47
|
# puts "Environment#create"
|
48
48
|
conn.execute IO.read(Postspec::SHARE_DIR + "/postspec_schema.sql")
|
49
|
-
conn.execute render.
|
49
|
+
conn.execute render.register_triggers(:create)
|
50
50
|
end
|
51
51
|
|
52
52
|
def drop()
|
@@ -76,7 +76,7 @@ module Postspec
|
|
76
76
|
case mode
|
77
77
|
when :seed
|
78
78
|
@uids = table_max_ids
|
79
|
-
render.
|
79
|
+
render.readonly_triggers(:create, @uids)
|
80
80
|
when :empty
|
81
81
|
@uids = {}
|
82
82
|
[]
|
@@ -92,7 +92,7 @@ module Postspec
|
|
92
92
|
tables, reset_sql = reset_data
|
93
93
|
sql =
|
94
94
|
case mode
|
95
|
-
when :seed; render.
|
95
|
+
when :seed; render.readonly_triggers(:drop) + render.delete_tables(SEED_TABLE_UIDS)
|
96
96
|
when :empty; []
|
97
97
|
else
|
98
98
|
raise ArgumentError
|
@@ -170,12 +170,12 @@ __END__
|
|
170
170
|
end
|
171
171
|
|
172
172
|
def setup_change_environment
|
173
|
-
conn.exec render.
|
173
|
+
conn.exec render.register_triggers(:create)
|
174
174
|
end
|
175
175
|
|
176
176
|
def teardown_change_environment
|
177
177
|
sql =
|
178
|
-
render.
|
178
|
+
render.register_triggers(:drop) +
|
179
179
|
render.delete_tables(CHANGE_TABLE_UIDS)
|
180
180
|
conn.exec render.execution_unit(CHANGE_TABLE_UIDS, sql)
|
181
181
|
end
|
@@ -188,7 +188,7 @@ __END__
|
|
188
188
|
|
189
189
|
def setup_seed_environment()
|
190
190
|
@uids = conn.map("select name, id from postspec.sequence_ids()")
|
191
|
-
sql = render.
|
191
|
+
sql = render.readonly_triggers(:create, uids)
|
192
192
|
conn.exec sql
|
193
193
|
end
|
194
194
|
|
@@ -196,7 +196,7 @@ __END__
|
|
196
196
|
@uids = nil
|
197
197
|
uids = conn.map "select table_uid, min(record_id) from postspec.inserts"
|
198
198
|
sql =
|
199
|
-
render.
|
199
|
+
render.readonly_triggers(:drop) +
|
200
200
|
render.delete_tables(uids) +
|
201
201
|
render.delete_tables(CHANGE_TABLE_UIDS) +
|
202
202
|
render.delete_tables(SEED_TABLE_UIDS)
|
@@ -316,12 +316,12 @@ __END__
|
|
316
316
|
class SeedEnvironment < Environment
|
317
317
|
def create
|
318
318
|
uids = @conn.map("select name, id from postspec.sequence_ids()", :name)
|
319
|
-
conn.exec render.
|
319
|
+
conn.exec render.readonly_triggers(:create, uids)
|
320
320
|
conn.exec "delete from postspec.seeds"
|
321
321
|
end
|
322
322
|
|
323
323
|
def drop
|
324
|
-
conn.exec render.
|
324
|
+
conn.exec render.readonly_triggers(:drop)
|
325
325
|
conn.exec "delete from postspec.seeds"
|
326
326
|
end
|
327
327
|
|
@@ -452,7 +452,7 @@ __END__
|
|
452
452
|
# meta doesn't know about the postspec schema
|
453
453
|
conn.execute(IO.read(SHARE_DIR + "/postspec_schema.sql"))
|
454
454
|
end
|
455
|
-
conn.execute(render.
|
455
|
+
conn.execute(render.register_triggers(:create))
|
456
456
|
end
|
457
457
|
|
458
458
|
def reset()
|
@@ -460,7 +460,7 @@ __END__
|
|
460
460
|
end
|
461
461
|
|
462
462
|
def drop()
|
463
|
-
conn.execute(render.
|
463
|
+
conn.execute(render.register_triggers(:drop))
|
464
464
|
conn.execute("drop schema postspec cascade")
|
465
465
|
end
|
466
466
|
end
|
data/lib/postspec/render.rb
CHANGED
@@ -4,27 +4,30 @@ module Postspec
|
|
4
4
|
attr_reader :postspec
|
5
5
|
forward_to :postspec, :conn
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
PRIORITY = "95" # Is a string because it needs two digits not matter the value
|
8
|
+
|
9
|
+
READONLY_BUD_TRIGGER_NAME = "p#{PRIORITY}_postspec_readonly_bud_trg"
|
10
|
+
READONLY_BT_TRIGGER_NAME = "p#{PRIORITY}_postspec_readonly_bt_trg"
|
11
|
+
REGISTER_TRIGGER_FORMAT = "p#{PRIORITY}_postspec_register_%s_b%s_trg"
|
9
12
|
|
10
13
|
def initialize(postspec)
|
11
14
|
constrain postspec, Postspec
|
12
15
|
@postspec = postspec
|
13
16
|
end
|
14
17
|
|
15
|
-
def truncate_tables(uids) ["truncate #{uids.join(', ')} cascade"] end
|
16
|
-
def delete_tables(uids) uids.map { |uid| "delete from #{uid}" } end # FIXME DUPLICATED
|
17
|
-
def reset_postspec_tables()
|
18
|
-
delete_tables %w(postspec.runs postspec.seeds postspec.inserts postspec.updates postspec.deletes)
|
19
|
-
end
|
20
18
|
|
21
19
|
def postspec_schema(state) raise NotYet end
|
22
20
|
|
23
|
-
|
21
|
+
# Create triggers to register changes in the database. It uses the postgres
|
22
|
+
# function register_EVENT to write the data to the postspec schema
|
23
|
+
#
|
24
|
+
# It is supposed to be called only once and the triggers can't be disabled
|
25
|
+
#
|
26
|
+
def register_triggers(state)
|
24
27
|
constrain state, lambda { |state| [:create, :drop].include?(state) }
|
25
28
|
postspec.tables.map { |table|
|
26
29
|
%w(insert update delete).map { |event|
|
27
|
-
name =
|
30
|
+
name = REGISTER_TRIGGER_FORMAT % [event, event[0]]
|
28
31
|
exist = postspec.meta.exist?("#{table.uid}.#{name}()")
|
29
32
|
if state == :create && !exist
|
30
33
|
ref = (event == "insert" ? "new" : "old")
|
@@ -42,18 +45,21 @@ module Postspec
|
|
42
45
|
}.flatten
|
43
46
|
end
|
44
47
|
|
45
|
-
|
48
|
+
# Create/drop readonly triggers. The triggers can be disabled because the
|
49
|
+
# tests may occasionally modify seed data
|
50
|
+
#
|
51
|
+
def readonly_triggers(state, uids = nil)
|
46
52
|
case state
|
47
|
-
when :create;
|
48
|
-
when :drop;
|
53
|
+
when :create; create_readonly_triggers(uids)
|
54
|
+
when :drop; drop_readonly_triggers
|
49
55
|
else
|
50
56
|
raise ArgumentError, state.inspect
|
51
57
|
end
|
52
58
|
end
|
53
59
|
|
54
|
-
def
|
60
|
+
def drop_readonly_triggers
|
55
61
|
postspec.tables.map { |uid|
|
56
|
-
[
|
62
|
+
[READONLY_BUD_TRIGGER_NAME, READONLY_BT_TRIGGER_NAME].map { |trigger|
|
57
63
|
trigger_uid = "#{uid}.#{trigger}()"
|
58
64
|
postspec.meta.exist?(trigger_uid) ? "drop trigger #{trigger} on #{uid}" : nil
|
59
65
|
}.compact
|
@@ -64,20 +70,19 @@ module Postspec
|
|
64
70
|
# error when seed data are updated, deleted, or truncated. They all call
|
65
71
|
# the common postspec.readonly_failure() function that raises a Postgres
|
66
72
|
# exception
|
67
|
-
def
|
73
|
+
def create_readonly_triggers(uids)
|
68
74
|
constrain uids, { String => [Integer, NilClass] }
|
69
75
|
result = []
|
70
76
|
uids.map { |uid, id|
|
71
|
-
bud_trigger = "#{uid}.#{SEED_BUD_TRIGGER_NAME}()"
|
72
77
|
bud_sql = <<~EOS1
|
73
|
-
create trigger #{
|
78
|
+
create trigger #{READONLY_BUD_TRIGGER_NAME}
|
74
79
|
before update or delete on #{uid}
|
75
80
|
for each row
|
76
81
|
when (OLD.id <= #{id})
|
77
82
|
execute function postspec.readonly_failure('#{uid}')
|
78
83
|
EOS1
|
79
84
|
bt_sql = <<~EOS2
|
80
|
-
create trigger
|
85
|
+
create trigger #{READONLY_BT_TRIGGER_NAME}
|
81
86
|
before truncate on #{uid}
|
82
87
|
execute function postspec.truncate_failure('#{uid}')
|
83
88
|
EOS2
|
@@ -102,6 +107,8 @@ module Postspec
|
|
102
107
|
materialized_views.map { |uid| "refresh materialized view #{uid}" }
|
103
108
|
end
|
104
109
|
|
110
|
+
def truncate_tables(uids) ["truncate #{uids.join(', ')} cascade"] end
|
111
|
+
|
105
112
|
def delete_tables(arg)
|
106
113
|
constrain arg, Array, Hash
|
107
114
|
uids = arg.is_a?(Array) ? arg.map { |uid| [uid, 0] }.to_h : arg
|
@@ -114,6 +121,10 @@ module Postspec
|
|
114
121
|
}
|
115
122
|
end
|
116
123
|
|
124
|
+
def reset_postspec_tables()
|
125
|
+
delete_tables %w(postspec.runs postspec.seeds postspec.inserts postspec.updates postspec.deletes)
|
126
|
+
end
|
127
|
+
|
117
128
|
# FIXME: doesn't seem to be any improvement performance-wise
|
118
129
|
def delete_tables_new(arg)
|
119
130
|
constrain arg, Array, Hash
|
data/lib/postspec/version.rb
CHANGED
@@ -57,7 +57,7 @@ $$ language plpgsql immutable leakproof;
|
|
57
57
|
|
58
58
|
create or replace function truncate_failure() returns trigger as $$
|
59
59
|
begin
|
60
|
-
raise 'Postspec: Can''t
|
60
|
+
raise 'Postspec: Can''t truncate %.%', TG_TABLE_SCHEMA, TG_TABLE_NAME;
|
61
61
|
return null;
|
62
62
|
end;
|
63
63
|
$$ language plpgsql immutable leakproof;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claus Rasmussen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-01-
|
11
|
+
date: 2025-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-inflector
|