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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea21b5a77ff6cb93cb75afe5319ce60f0bb41e20415e8e157a1ab3bf80798d31
4
- data.tar.gz: a83e04fdf627affb446495e76f41f610bcfed5ef77d5d9a9f310d906961f569d
3
+ metadata.gz: bbef9ecda05ff7deeb013906388668f187ce267a1d173f8b66cf414fa2fbc38b
4
+ data.tar.gz: 07e283ea4dcf43f3725f6af41f776240c3ed63f537415f1fafc5e29fa5da8ccd
5
5
  SHA512:
6
- metadata.gz: 18518d724e9b09ff3b5d145cf4e68398ea4f4e081508276438b579694bf373ce572b77d4835d124a08d35aab0e70a0bd47bab3b14b3f88180b50a8990c06489c
7
- data.tar.gz: aed775cf5e81476f2e709cb51494b432f5eea41889093f5fc47bc70cf02c77fff3d9aeed0a6f1b3a72d6e90c502dbe056fe6473477c5b763df8627093a5e1c8a
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.2"
2
+ VERSION = "0.5.3"
3
3
  end
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.2
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