chrono_model 0.12.2 → 0.12.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
  SHA1:
3
- metadata.gz: 69a13f407cf20b6ffbf08382a831c49085158b7d
4
- data.tar.gz: 9461316b8a2b3b0498e8d1fc8dc45b15e5492905
3
+ metadata.gz: 867208c8ba66191c8cf3bdebbc9eb4d811d59625
4
+ data.tar.gz: 4651e58743b71d6cb54bba59929fec7c10ae80ac
5
5
  SHA512:
6
- metadata.gz: 81ef0ab38b9d33cd457bd33c869128e480d2493120e66fe50624aae94a8a6899df462285ec8003f5f9413f5ccf6d362b53699f20cc5be3b83d9d92ccbdcb65bb
7
- data.tar.gz: e3673608283f66ecb82808f9b4ee64e7da9c7c76a44e297e826284755607e38194ebf2a8aad12bbd92bbb5ac7cd91c5d11fb91b72dabd2431671cc22307914b4
6
+ metadata.gz: 5dd88e44a1fedb1bb33199f2483c7d008fda05c753510d74b0fdb1fd9a2966138a0838b68d08d8e088d8e6bd36c50588f76357d327a966f6af68abc520ccbc6e
7
+ data.tar.gz: 297be09d1673a4235bc3168fdfdf087612740790d33ca99b0eff033f24738536854ff7044f024a1b86df9da84c5fdb1e43cd9e90da2e212c2e02c5ce39bc475d
data/README.md CHANGED
@@ -66,7 +66,7 @@ All timestamps are _forcibly_ stored in as UTC, bypassing the
66
66
  ## Requirements
67
67
 
68
68
  * Ruby >= 2.2 (1.9 to 2.1 could still work, but aren't supported).
69
- * Active Record 4.2 or 5.0 (4.2 doesn't work with Ruby 2.4, though)
69
+ * Active Record 4.2, 5.0 or 5.1. NOTE: AR 4.2 is not compatible with Ruby 2.4. [Detailed matrix](https://travis-ci.org/ifad/chronomodel)
70
70
  * PostgreSQL >= 9.3
71
71
  * The `btree_gist` PostgreSQL extension
72
72
  * The `plpython` PostgreSQL extension if you have *JSON* (*not* JSONB) columns
@@ -106,9 +106,7 @@ module ChronoModel
106
106
 
107
107
  # Drop functions
108
108
  #
109
- %w( insert update delete ).each do |func|
110
- execute "DROP FUNCTION chronomodel_#{name}_#{func}()"
111
- end
109
+ chrono_drop_trigger_functions_for(name)
112
110
 
113
111
  # Create view and functions
114
112
  #
@@ -168,11 +166,7 @@ module ChronoModel
168
166
  #
169
167
  execute "DROP VIEW #{table_name}"
170
168
 
171
- _on_temporal_schema do
172
- %w( insert update delete ).each do |func|
173
- execute "DROP FUNCTION IF EXISTS #{table_name}_#{func}() CASCADE"
174
- end
175
- end
169
+ chrono_drop_trigger_functions_for(table_name)
176
170
 
177
171
  _on_history_schema { execute "DROP TABLE #{table_name}" }
178
172
 
@@ -198,6 +192,8 @@ module ChronoModel
198
192
  return super unless is_chrono?(table_name)
199
193
 
200
194
  _on_temporal_schema { execute "DROP TABLE #{table_name} CASCADE" }
195
+
196
+ chrono_drop_trigger_functions_for(table_name)
201
197
  end
202
198
 
203
199
  # If adding an index to a temporal table, add it to the one in the
@@ -852,6 +848,12 @@ module ChronoModel
852
848
  SQL
853
849
  end
854
850
 
851
+ def chrono_drop_trigger_functions_for(table_name)
852
+ %w( insert update delete ).each do |func|
853
+ execute "DROP FUNCTION IF EXISTS chronomodel_#{table_name}_#{func}()"
854
+ end
855
+ end
856
+
855
857
  # In destructive changes, such as removing columns or changing column
856
858
  # types, the view must be dropped and recreated, while the change has
857
859
  # to be applied to the table in the temporal schema.
@@ -1,3 +1,3 @@
1
1
  module ChronoModel
2
- VERSION = "0.12.2"
2
+ VERSION = "0.12.3"
3
3
  end
data/spec/adapter_spec.rb CHANGED
@@ -9,6 +9,7 @@ shared_examples_for 'temporal table' do
9
9
  it { is_expected.to have_temporal_backing }
10
10
  it { is_expected.to have_history_backing }
11
11
  it { is_expected.to have_history_extra_columns }
12
+ it { is_expected.to have_history_functions }
12
13
  it { is_expected.to have_public_interface }
13
14
 
14
15
  it { is_expected.to have_columns(columns) }
@@ -23,6 +24,7 @@ shared_examples_for 'plain table' do
23
24
 
24
25
  it { is_expected.to_not have_temporal_backing }
25
26
  it { is_expected.to_not have_history_backing }
27
+ it { is_expected.to_not have_history_functions }
26
28
  it { is_expected.to_not have_public_interface }
27
29
 
28
30
  it { is_expected.to have_columns(columns) }
@@ -168,6 +170,7 @@ describe ChronoModel::Adapter do
168
170
  it { is_expected.to_not have_public_backing }
169
171
  it { is_expected.to_not have_temporal_backing }
170
172
  it { is_expected.to_not have_history_backing }
173
+ it { is_expected.to_not have_history_functions }
171
174
  it { is_expected.to_not have_public_interface }
172
175
  end
173
176
 
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,7 @@ require 'support/matchers/schema'
10
10
  require 'support/matchers/table'
11
11
  require 'support/matchers/column'
12
12
  require 'support/matchers/index'
13
+ require 'support/matchers/function'
13
14
  require 'support/aruba'
14
15
 
15
16
  # Rails 5 returns a True/FalseClass
@@ -0,0 +1,79 @@
1
+ module ChronoTest::Matchers
2
+
3
+ module Column
4
+ class HaveFunctions < ChronoTest::Matchers::Base
5
+ def initialize(functions, schema = 'public')
6
+ @functions = functions
7
+ @schema = schema
8
+ end
9
+
10
+ def description
11
+ 'have functions'
12
+ end
13
+
14
+ def matches?(table)
15
+ super(table)
16
+
17
+ @matches = @functions.inject({}) do |h, name|
18
+ h.update(name => has_function?(name))
19
+ end
20
+
21
+ @matches.values.all?
22
+ end
23
+
24
+ def failure_message
25
+ message_matches("expected #{@schema}.#{table} to have")
26
+ end
27
+
28
+ def failure_message_when_negated
29
+ message_matches("expected #{@schema}.#{table} to not have")
30
+ end
31
+
32
+ protected
33
+ def has_function?(name)
34
+ select_value(<<-SQL, [name], 'Check function') == AR_TRUE
35
+ SELECT EXISTS(
36
+ SELECT 1
37
+ FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n
38
+ WHERE p.pronamespace = n.oid
39
+ AND n.nspname = 'public'
40
+ AND p.proname = ?
41
+ )
42
+ SQL
43
+ end
44
+
45
+ private
46
+ def message_matches(message)
47
+ (message << ' ').tap do |message|
48
+ message << @matches.map do |name, match|
49
+ "a #{name} function"
50
+ end.compact.to_sentence
51
+ end
52
+ end
53
+ end
54
+
55
+ def have_functions(*args)
56
+ HaveFunctions.new(*args)
57
+ end
58
+
59
+ class HaveHistoryFunctions < HaveFunctions
60
+ def initialize
61
+ @function_templates = [
62
+ 'chronomodel_%s_insert',
63
+ 'chronomodel_%s_update',
64
+ 'chronomodel_%s_delete',
65
+ ]
66
+ end
67
+
68
+ def matches?(table)
69
+ @functions = @function_templates.map {|t| t % [table] }
70
+
71
+ super(table)
72
+ end
73
+ end
74
+
75
+ def have_history_functions
76
+ HaveHistoryFunctions.new
77
+ end
78
+ end
79
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chrono_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.2
4
+ version: 0.12.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcello Barnaba
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-03-21 00:00:00.000000000 Z
12
+ date: 2018-07-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -250,6 +250,7 @@ files:
250
250
  - spec/support/helpers.rb
251
251
  - spec/support/matchers/base.rb
252
252
  - spec/support/matchers/column.rb
253
+ - spec/support/matchers/function.rb
253
254
  - spec/support/matchers/index.rb
254
255
  - spec/support/matchers/schema.rb
255
256
  - spec/support/matchers/table.rb
@@ -302,6 +303,7 @@ test_files:
302
303
  - spec/support/helpers.rb
303
304
  - spec/support/matchers/base.rb
304
305
  - spec/support/matchers/column.rb
306
+ - spec/support/matchers/function.rb
305
307
  - spec/support/matchers/index.rb
306
308
  - spec/support/matchers/schema.rb
307
309
  - spec/support/matchers/table.rb