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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a391625a2f772e728fcc9c7eb0626e47a5cdacb43e770afe239da3cac393606
4
- data.tar.gz: efc3dd134049aff64eb4f459e22a74ecdae6e8333123baa5433444275e1cdde7
3
+ metadata.gz: bbef9ecda05ff7deeb013906388668f187ce267a1d173f8b66cf414fa2fbc38b
4
+ data.tar.gz: 07e283ea4dcf43f3725f6af41f776240c3ed63f537415f1fafc5e29fa5da8ccd
5
5
  SHA512:
6
- metadata.gz: ac0f2dc6771a9f3949ae02448d6c399f8387647f35fce871543eba99c803a71a6edfdc2ba4fc4c473f3f8837b120f64e152a989fc0e436de6b9995d7409c00d2
7
- data.tar.gz: d78238c6edff5869caf9cbba9d4ce34329f1e3fe49dfba31431951092af8df06bc26e164e7372c72c5cd00a14d0dbb612abd980109e288f6b23e47ecdd3cfb63
6
+ metadata.gz: 8218dd2502c9ba7c4db0f3ca4384a2997571bbee90f75946057ebf7b33e7f2fc6b1c0fc552084f9c1c3c02d5f3bf5f2a53c656540fd87859ef26ba8b73292364
7
+ data.tar.gz: 03ab635533126ea2fea4711925bfcd3f800344ad9ba57561e3fadbe291046413ac21b8b5d4e573156ab711215b467fbeea49c3b8afad1034bfed8ec5000d355b
@@ -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.change_triggers(:create)
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.seed_triggers(:create, @uids)
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.seed_triggers(:drop) + render.delete_tables(SEED_TABLE_UIDS)
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.change_triggers(:create)
173
+ conn.exec render.register_triggers(:create)
174
174
  end
175
175
 
176
176
  def teardown_change_environment
177
177
  sql =
178
- render.change_triggers(:drop) +
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.seed_triggers(:create, uids)
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.seed_triggers(:drop) +
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.seed_triggers(:create, uids)
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.seed_triggers(:drop)
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.change_triggers(:create))
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.change_triggers(:drop))
463
+ conn.execute(render.register_triggers(:drop))
464
464
  conn.execute("drop schema postspec cascade")
465
465
  end
466
466
  end
@@ -4,27 +4,30 @@ module Postspec
4
4
  attr_reader :postspec
5
5
  forward_to :postspec, :conn
6
6
 
7
- SEED_BUD_TRIGGER_NAME = "postspec_readonly_bud_trg"
8
- SEED_BT_TRIGGER_NAME = "postspec_readonly_bt_trg"
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
- def change_triggers(state)
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 = "register_#{event}_b#{event[0]}_trg"
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
- def seed_triggers(state, uids = nil)
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; create_seed_triggers(uids)
48
- when :drop; drop_seed_triggers
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 drop_seed_triggers
60
+ def drop_readonly_triggers
55
61
  postspec.tables.map { |uid|
56
- [SEED_BUD_TRIGGER_NAME, SEED_BT_TRIGGER_NAME].map { |trigger|
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 create_seed_triggers(uids)
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 #{SEED_BUD_TRIGGER_NAME}
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 postspec_readonly_bt_trg
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
@@ -1,3 +1,3 @@
1
1
  module Postspec
2
- VERSION = "0.5.1"
2
+ VERSION = "0.5.3"
3
3
  end
@@ -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 modify truncate %.%', TG_TABLE_SCHEMA, TG_TABLE_NAME;
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.1
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 00:00:00.000000000 Z
11
+ date: 2025-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-inflector