postspec 0.5.2 → 0.5.3
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/lib/postspec/environment.rb +11 -11
- data/lib/postspec/render.rb +29 -18
- data/lib/postspec/version.rb +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
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
|