temporal_tables 1.1.0 → 3.0.0.pre.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +15 -11
  3. data/.rubocop.yml +30 -146
  4. data/.ruby-version +1 -1
  5. data/gemfiles/Gemfile.6.1.mysql +3 -0
  6. data/gemfiles/Gemfile.6.1.mysql.lock +147 -87
  7. data/gemfiles/Gemfile.6.1.pg +3 -0
  8. data/gemfiles/Gemfile.6.1.pg.lock +148 -88
  9. data/gemfiles/Gemfile.7.0.mysql +3 -0
  10. data/gemfiles/Gemfile.7.0.mysql.lock +150 -84
  11. data/gemfiles/Gemfile.7.0.pg +3 -0
  12. data/gemfiles/Gemfile.7.0.pg.lock +151 -85
  13. data/gemfiles/{Gemfile.6.0.mysql → Gemfile.7.1.mysql} +4 -1
  14. data/gemfiles/Gemfile.7.1.mysql.lock +266 -0
  15. data/gemfiles/{Gemfile.6.0.pg → Gemfile.7.1.pg} +4 -1
  16. data/gemfiles/Gemfile.7.1.pg.lock +266 -0
  17. data/lib/temporal_tables/arel_table.rb +1 -1
  18. data/lib/temporal_tables/association_extensions.rb +8 -0
  19. data/lib/temporal_tables/connection_adapters/mysql_adapter.rb +2 -2
  20. data/lib/temporal_tables/connection_adapters/postgresql_adapter.rb +2 -2
  21. data/lib/temporal_tables/constants.rb +5 -0
  22. data/lib/temporal_tables/temporal_adapter.rb +4 -3
  23. data/lib/temporal_tables/temporal_class.rb +4 -2
  24. data/lib/temporal_tables/version.rb +1 -1
  25. data/lib/temporal_tables.rb +2 -6
  26. data/spec/basic_history_spec.rb +39 -4
  27. data/spec/internal/app/models/bird/nest.rb +6 -0
  28. data/spec/internal/app/models/bird.rb +5 -0
  29. data/spec/internal/db/schema.rb +9 -0
  30. data/spec/spec_helper.rb +1 -1
  31. data/temporal_tables.gemspec +6 -4
  32. metadata +50 -19
  33. data/.travis.yml +0 -11
  34. data/gemfiles/Gemfile.6.0.mysql.lock +0 -171
  35. data/gemfiles/Gemfile.6.0.pg.lock +0 -176
  36. data/lib/temporal_tables/temporal_adapter_six_oh.rb +0 -207
@@ -0,0 +1,266 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ temporal_tables (3.0.0)
5
+ rails (>= 6.0, < 7.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actioncable (7.1.2)
11
+ actionpack (= 7.1.2)
12
+ activesupport (= 7.1.2)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ zeitwerk (~> 2.6)
16
+ actionmailbox (7.1.2)
17
+ actionpack (= 7.1.2)
18
+ activejob (= 7.1.2)
19
+ activerecord (= 7.1.2)
20
+ activestorage (= 7.1.2)
21
+ activesupport (= 7.1.2)
22
+ mail (>= 2.7.1)
23
+ net-imap
24
+ net-pop
25
+ net-smtp
26
+ actionmailer (7.1.2)
27
+ actionpack (= 7.1.2)
28
+ actionview (= 7.1.2)
29
+ activejob (= 7.1.2)
30
+ activesupport (= 7.1.2)
31
+ mail (~> 2.5, >= 2.5.4)
32
+ net-imap
33
+ net-pop
34
+ net-smtp
35
+ rails-dom-testing (~> 2.2)
36
+ actionpack (7.1.2)
37
+ actionview (= 7.1.2)
38
+ activesupport (= 7.1.2)
39
+ nokogiri (>= 1.8.5)
40
+ racc
41
+ rack (>= 2.2.4)
42
+ rack-session (>= 1.0.1)
43
+ rack-test (>= 0.6.3)
44
+ rails-dom-testing (~> 2.2)
45
+ rails-html-sanitizer (~> 1.6)
46
+ actiontext (7.1.2)
47
+ actionpack (= 7.1.2)
48
+ activerecord (= 7.1.2)
49
+ activestorage (= 7.1.2)
50
+ activesupport (= 7.1.2)
51
+ globalid (>= 0.6.0)
52
+ nokogiri (>= 1.8.5)
53
+ actionview (7.1.2)
54
+ activesupport (= 7.1.2)
55
+ builder (~> 3.1)
56
+ erubi (~> 1.11)
57
+ rails-dom-testing (~> 2.2)
58
+ rails-html-sanitizer (~> 1.6)
59
+ activejob (7.1.2)
60
+ activesupport (= 7.1.2)
61
+ globalid (>= 0.3.6)
62
+ activemodel (7.1.2)
63
+ activesupport (= 7.1.2)
64
+ activerecord (7.1.2)
65
+ activemodel (= 7.1.2)
66
+ activesupport (= 7.1.2)
67
+ timeout (>= 0.4.0)
68
+ activestorage (7.1.2)
69
+ actionpack (= 7.1.2)
70
+ activejob (= 7.1.2)
71
+ activerecord (= 7.1.2)
72
+ activesupport (= 7.1.2)
73
+ marcel (~> 1.0)
74
+ activesupport (7.1.2)
75
+ base64
76
+ bigdecimal
77
+ concurrent-ruby (~> 1.0, >= 1.0.2)
78
+ connection_pool (>= 2.2.5)
79
+ drb
80
+ i18n (>= 1.6, < 2)
81
+ minitest (>= 5.1)
82
+ mutex_m
83
+ tzinfo (~> 2.0)
84
+ ast (2.4.2)
85
+ base64 (0.2.0)
86
+ bigdecimal (3.1.5)
87
+ builder (3.2.4)
88
+ byebug (11.1.3)
89
+ combustion (1.3.7)
90
+ activesupport (>= 3.0.0)
91
+ railties (>= 3.0.0)
92
+ thor (>= 0.14.6)
93
+ concurrent-ruby (1.2.2)
94
+ connection_pool (2.4.1)
95
+ crass (1.0.6)
96
+ database_cleaner (2.0.2)
97
+ database_cleaner-active_record (>= 2, < 3)
98
+ database_cleaner-active_record (2.1.0)
99
+ activerecord (>= 5.a)
100
+ database_cleaner-core (~> 2.0.0)
101
+ database_cleaner-core (2.0.1)
102
+ date (3.3.4)
103
+ diff-lcs (1.5.0)
104
+ drb (2.2.0)
105
+ ruby2_keywords
106
+ erubi (1.12.0)
107
+ gemika (0.8.2)
108
+ globalid (1.2.1)
109
+ activesupport (>= 6.1)
110
+ i18n (1.14.1)
111
+ concurrent-ruby (~> 1.0)
112
+ io-console (0.7.1)
113
+ irb (1.11.0)
114
+ rdoc
115
+ reline (>= 0.3.8)
116
+ json (2.7.1)
117
+ language_server-protocol (3.17.0.3)
118
+ loofah (2.22.0)
119
+ crass (~> 1.0.2)
120
+ nokogiri (>= 1.12.0)
121
+ mail (2.8.1)
122
+ mini_mime (>= 0.1.1)
123
+ net-imap
124
+ net-pop
125
+ net-smtp
126
+ marcel (1.0.2)
127
+ mini_mime (1.1.5)
128
+ minitest (5.20.0)
129
+ mutex_m (0.2.0)
130
+ net-imap (0.4.9)
131
+ date
132
+ net-protocol
133
+ net-pop (0.1.2)
134
+ net-protocol
135
+ net-protocol (0.2.2)
136
+ timeout
137
+ net-smtp (0.4.0)
138
+ net-protocol
139
+ nio4r (2.7.0)
140
+ nokogiri (1.16.0-x86_64-linux)
141
+ racc (~> 1.4)
142
+ parallel (1.24.0)
143
+ parser (3.3.0.0)
144
+ ast (~> 2.4.1)
145
+ racc
146
+ pg (1.5.4)
147
+ psych (5.1.2)
148
+ stringio
149
+ racc (1.7.3)
150
+ rack (3.0.8)
151
+ rack-session (2.0.0)
152
+ rack (>= 3.0.0)
153
+ rack-test (2.1.0)
154
+ rack (>= 1.3)
155
+ rackup (2.1.0)
156
+ rack (>= 3)
157
+ webrick (~> 1.8)
158
+ rails (7.1.2)
159
+ actioncable (= 7.1.2)
160
+ actionmailbox (= 7.1.2)
161
+ actionmailer (= 7.1.2)
162
+ actionpack (= 7.1.2)
163
+ actiontext (= 7.1.2)
164
+ actionview (= 7.1.2)
165
+ activejob (= 7.1.2)
166
+ activemodel (= 7.1.2)
167
+ activerecord (= 7.1.2)
168
+ activestorage (= 7.1.2)
169
+ activesupport (= 7.1.2)
170
+ bundler (>= 1.15.0)
171
+ railties (= 7.1.2)
172
+ rails-dom-testing (2.2.0)
173
+ activesupport (>= 5.0.0)
174
+ minitest
175
+ nokogiri (>= 1.6)
176
+ rails-html-sanitizer (1.6.0)
177
+ loofah (~> 2.21)
178
+ nokogiri (~> 1.14)
179
+ railties (7.1.2)
180
+ actionpack (= 7.1.2)
181
+ activesupport (= 7.1.2)
182
+ irb
183
+ rackup (>= 1.0.0)
184
+ rake (>= 12.2)
185
+ thor (~> 1.0, >= 1.2.2)
186
+ zeitwerk (~> 2.6)
187
+ rainbow (3.1.1)
188
+ rake (13.1.0)
189
+ rdoc (6.6.2)
190
+ psych (>= 4.0.0)
191
+ regexp_parser (2.8.3)
192
+ reline (0.4.1)
193
+ io-console (~> 0.5)
194
+ rexml (3.2.6)
195
+ rspec (3.12.0)
196
+ rspec-core (~> 3.12.0)
197
+ rspec-expectations (~> 3.12.0)
198
+ rspec-mocks (~> 3.12.0)
199
+ rspec-core (3.12.2)
200
+ rspec-support (~> 3.12.0)
201
+ rspec-expectations (3.12.3)
202
+ diff-lcs (>= 1.2.0, < 2.0)
203
+ rspec-support (~> 3.12.0)
204
+ rspec-mocks (3.12.6)
205
+ diff-lcs (>= 1.2.0, < 2.0)
206
+ rspec-support (~> 3.12.0)
207
+ rspec-support (3.12.1)
208
+ rubocop (1.59.0)
209
+ json (~> 2.3)
210
+ language_server-protocol (>= 3.17.0)
211
+ parallel (~> 1.10)
212
+ parser (>= 3.2.2.4)
213
+ rainbow (>= 2.2.2, < 4.0)
214
+ regexp_parser (>= 1.8, < 3.0)
215
+ rexml (>= 3.2.5, < 4.0)
216
+ rubocop-ast (>= 1.30.0, < 2.0)
217
+ ruby-progressbar (~> 1.7)
218
+ unicode-display_width (>= 2.4.0, < 3.0)
219
+ rubocop-ast (1.30.0)
220
+ parser (>= 3.2.1.0)
221
+ rubocop-capybara (2.20.0)
222
+ rubocop (~> 1.41)
223
+ rubocop-factory_bot (2.25.0)
224
+ rubocop (~> 1.33)
225
+ rubocop-rails (2.23.1)
226
+ activesupport (>= 4.2.0)
227
+ rack (>= 1.1)
228
+ rubocop (>= 1.33.0, < 2.0)
229
+ rubocop-ast (>= 1.30.0, < 2.0)
230
+ rubocop-rspec (2.26.1)
231
+ rubocop (~> 1.40)
232
+ rubocop-capybara (~> 2.17)
233
+ rubocop-factory_bot (~> 2.22)
234
+ ruby-progressbar (1.13.0)
235
+ ruby2_keywords (0.0.5)
236
+ stringio (3.1.0)
237
+ thor (1.3.0)
238
+ timeout (0.4.1)
239
+ tzinfo (2.0.6)
240
+ concurrent-ruby (~> 1.0)
241
+ unicode-display_width (2.5.0)
242
+ webrick (1.8.1)
243
+ websocket-driver (0.7.6)
244
+ websocket-extensions (>= 0.1.0)
245
+ websocket-extensions (0.1.5)
246
+ zeitwerk (2.6.12)
247
+
248
+ PLATFORMS
249
+ x86_64-linux
250
+
251
+ DEPENDENCIES
252
+ byebug
253
+ combustion
254
+ database_cleaner
255
+ gemika
256
+ pg (>= 0.18, < 2.0)
257
+ rails (~> 7.1.0)
258
+ rake
259
+ rspec (~> 3.4)
260
+ rubocop
261
+ rubocop-rails
262
+ rubocop-rspec
263
+ temporal_tables!
264
+
265
+ BUNDLED WITH
266
+ 2.4.10
@@ -9,7 +9,7 @@ module TemporalTables
9
9
  if at_value
10
10
  join =
11
11
  join
12
- .and(to[:eff_to].gteq(at_value))
12
+ .and(to[:eff_to].gt(at_value).or(to[:eff_to].eq(TemporalTables::END_OF_TIME)))
13
13
  .and(to[:eff_from].lteq(at_value))
14
14
  end
15
15
  join
@@ -16,6 +16,14 @@ module TemporalTables
16
16
  super
17
17
  end
18
18
  end
19
+
20
+ # There seems to be an issue with the statement cache for history associations.
21
+ # This may be due to the at_value not being part of how the relations are hashed,
22
+ # or that the cached statements are not parameterized. Will require further investigation.
23
+ # In the meantime, we can workaround this issue by disabling the statement cache for History queries.
24
+ def skip_statement_cache?(scope)
25
+ klass.is_a?(TemporalTables::TemporalClass::ClassMethods) || super(scope)
26
+ end
19
27
  end
20
28
  end
21
29
 
@@ -34,7 +34,7 @@ module TemporalTables
34
34
 
35
35
  update #{temporal_name(table_name)} set eff_to = @current_time
36
36
  where #{primary_key} = new.#{primary_key}
37
- and eff_to = '9999-12-31';
37
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
38
38
 
39
39
  insert into #{temporal_name(table_name)} (#{column_names.join(', ')}, eff_from)
40
40
  values (#{column_names.collect { |c| "new.#{c}" }.join(', ')}, @current_time);
@@ -51,7 +51,7 @@ module TemporalTables
51
51
 
52
52
  update #{temporal_name(table_name)} set eff_to = @current_time
53
53
  where #{primary_key} = old.#{primary_key}
54
- and eff_to = '9999-12-31';
54
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
55
55
 
56
56
  end
57
57
  }
@@ -40,7 +40,7 @@ module TemporalTables
40
40
 
41
41
  update #{temporal_name(table_name)} set eff_to = cur_time
42
42
  where #{primary_key} = new.#{primary_key}
43
- and eff_to = '9999-12-31';
43
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
44
44
 
45
45
  insert into #{temporal_name(table_name)} (#{column_list(column_names)}, eff_from)
46
46
  values (#{column_names.collect { |c| "new.#{c}" }.join(', ')}, cur_time);
@@ -63,7 +63,7 @@ module TemporalTables
63
63
 
64
64
  update #{temporal_name(table_name)} set eff_to = cur_time
65
65
  where #{primary_key} = old.#{primary_key}
66
- and eff_to = '9999-12-31';
66
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
67
67
 
68
68
  return null;
69
69
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TemporalTables
4
+ END_OF_TIME = '9999-12-31'
5
+ end
@@ -5,12 +5,13 @@ require 'digest'
5
5
  module TemporalTables
6
6
  module TemporalAdapter # rubocop:disable Metrics/ModuleLength
7
7
  def create_table(table_name, **options, &block) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
8
+ valid_options = options.except(:temporal, :temporal_bypass)
8
9
  if options[:temporal_bypass]
9
- super(table_name, **options, &block)
10
+ super(table_name, **valid_options, &block)
10
11
  else
11
12
  skip_table = TemporalTables.skipped_temporal_tables.include?(table_name.to_sym) || table_name.to_s =~ /_h$/
12
13
 
13
- super(table_name, **options) do |t|
14
+ super(table_name, **valid_options) do |t|
14
15
  block.call t
15
16
 
16
17
  if TemporalTables.add_updated_by_field && !skip_table
@@ -35,7 +36,7 @@ module TemporalTables
35
36
  **options.merge(id: false, primary_key: 'history_id', temporal_bypass: true)
36
37
  ) do |t|
37
38
  t.datetime :eff_from, null: false, limit: 6
38
- t.datetime :eff_to, null: false, limit: 6, default: '9999-12-31'
39
+ t.datetime :eff_to, null: false, limit: 6, default: TemporalTables::END_OF_TIME
39
40
 
40
41
  columns(table_name).each do |c|
41
42
  column_options = { limit: c.limit }
@@ -33,7 +33,7 @@ module TemporalTables
33
33
 
34
34
  # Calling .history here will ensure that the history class
35
35
  # for this association is created and initialized
36
- clazz = association.class_name.constantize.history
36
+ clazz = association.klass.history
37
37
 
38
38
  # Recreate the association, updating it to point at the
39
39
  # history class. The foreign key is explicitly set since it's
@@ -74,8 +74,10 @@ module TemporalTables
74
74
 
75
75
  delegate :descends_from_active_record?, to: :superclass
76
76
 
77
+ # An object at a given time should fall within the range, excluding the effective end date.
78
+ # However, when using '9999-12-31', this is effectively infinity and should not be excluded.
77
79
  def build_temporal_constraint(at_value)
78
- arel_table[:eff_to].gteq(at_value).and(
80
+ arel_table[:eff_to].gt(at_value).or(arel_table[:eff_to].eq(TemporalTables::END_OF_TIME)).and(
79
81
  arel_table[:eff_from].lteq(at_value)
80
82
  )
81
83
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TemporalTables
4
- VERSION = '1.1.0'
4
+ VERSION = '3.0.0-rc.1'
5
5
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'temporal_tables/temporal_adapter'
4
- require 'temporal_tables/temporal_adapter_six_oh'
5
4
  require 'temporal_tables/connection_adapters/mysql_adapter'
6
5
  require 'temporal_tables/connection_adapters/postgresql_adapter'
7
6
  require 'temporal_tables/whodunnit'
@@ -12,6 +11,7 @@ require 'temporal_tables/association_extensions'
12
11
  require 'temporal_tables/preloader_extensions'
13
12
  require 'temporal_tables/reflection_extensions'
14
13
  require 'temporal_tables/arel_table'
14
+ require 'temporal_tables/constants'
15
15
  require 'temporal_tables/version'
16
16
 
17
17
  module TemporalTables
@@ -22,11 +22,7 @@ module TemporalTables
22
22
  # It's necessary to do this on the implementations in order for the
23
23
  # alias method chain hooks to work.
24
24
  ActiveRecord::ConnectionAdapters::AbstractAdapter.subclasses.each do |subclass|
25
- if ActiveRecord.version < ::Gem::Version.new('6.1')
26
- subclass.send :prepend, TemporalTables::TemporalAdapterSixOh
27
- else
28
- subclass.send :prepend, TemporalTables::TemporalAdapter
29
- end
25
+ subclass.send :prepend, TemporalTables::TemporalAdapter
30
26
 
31
27
  module_name = subclass.name.split('::').last
32
28
  next unless TemporalTables::ConnectionAdapters.const_defined?(module_name)
@@ -90,10 +90,10 @@ describe Person do
90
90
  where = sql[4]
91
91
 
92
92
  expect(from.scan(/.warts_h.\..eff_from./i).count).to eq(1)
93
- expect(from.scan(/.warts_h.\..eff_to./i).count).to eq(1)
93
+ expect(from.scan(/.warts_h.\..eff_to./i).count).to eq(2)
94
94
 
95
95
  expect(where.scan(/.people_h.\..eff_from./i).count).to eq(1)
96
- expect(where.scan(/.people_h.\..eff_to./i).count).to eq(1)
96
+ expect(where.scan(/.people_h.\..eff_to./i).count).to eq(2)
97
97
  expect(where.scan(/.warts_h.\..eff_from./i).count).to eq(0)
98
98
  expect(where.scan(/.warts_h.\..eff_to./i).count).to eq(0)
99
99
  end
@@ -132,6 +132,21 @@ describe Person do
132
132
  end
133
133
  end
134
134
 
135
+ # This test is to cover the StatementCache issue being worked around by the monkey patch in AssociationExtensions
136
+ describe 'when making multiple association queries with different at values for different data' do
137
+ it 'the correct data should be returned' do
138
+ sabrina = Person.create name: 'Sabrina'
139
+ sabrina_wart = Wart.create person: sabrina
140
+ sabrina_wart.history.at(Time.current).first.person
141
+
142
+ willow = Person.create name: 'Willow'
143
+ willow_wart = Wart.create person: willow
144
+ current_willow = willow_wart.history.at(Time.current).first.person
145
+
146
+ expect(current_willow.name).to eq('Willow')
147
+ end
148
+ end
149
+
135
150
  describe 'when working with STI one level deep' do
136
151
  let!(:broom) { Broom.create person: emily, model: 'Cackler 2000' }
137
152
 
@@ -180,7 +195,7 @@ describe Person do
180
195
  describe 'when spawning and renaming a creature with PK not named id' do
181
196
  let!(:dog) { Dog.create name: 'Fido' }
182
197
 
183
- context 'Fido is renamed to Max' do
198
+ context 'when Fido is renamed to Max' do
184
199
  before do
185
200
  dog.name = 'Max'
186
201
  dog.save!
@@ -195,7 +210,13 @@ describe Person do
195
210
  expect(fido.orig_obj.name).to eq('Max')
196
211
  end
197
212
 
198
- context 'Max is rehomed' do
213
+ it 'at the exact time of the name change, the dog should not be both Max and Fido' do
214
+ dog_at_moment_of_name_change = dog.history.at(dog.history.last.eff_from)
215
+ expect(dog_at_moment_of_name_change.count).to eq(1)
216
+ expect(dog_at_moment_of_name_change.first.name).to eq('Max')
217
+ end
218
+
219
+ context 'when Max is rehomed' do
199
220
  before do
200
221
  dog.destroy!
201
222
  end
@@ -209,3 +230,17 @@ describe Person do
209
230
  end
210
231
  end
211
232
  end
233
+
234
+ describe Bird do
235
+ context 'when a bird and nest exist' do
236
+ let(:bird) { Bird.create name: 'Sam' }
237
+ let(:nest) { Bird::Nest.create bird: bird, height: 100 }
238
+
239
+ it 'can create instance of class with nested class name with history entries' do
240
+ expect(bird).not_to be_nil
241
+ expect(nest).not_to be_nil
242
+ expect(bird.history.first).not_to be_nil
243
+ expect(nest.history.first).not_to be_nil
244
+ end
245
+ end
246
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Bird::Nest < ActiveRecord::Base
4
+ self.table_name = 'nests'
5
+ belongs_to :bird, inverse_of: :nest
6
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Bird < ActiveRecord::Base
4
+ has_one :nest, inverse_of: :bird
5
+ end
@@ -60,4 +60,13 @@ ActiveRecord::Schema.define do
60
60
  create_table :a_very_very_very_very_very_long_table_name, temporal: true do |t|
61
61
  t.string :name
62
62
  end
63
+
64
+ create_table :birds, id: (postgres ? :uuid : :integer), temporal: true, force: true do |t|
65
+ t.string :name
66
+ end
67
+
68
+ create_table :nests, id: (postgres ? :uuid : :integer), temporal: true do |t|
69
+ t.belongs_to :bird, type: (postgres ? :uuid : :integer)
70
+ t.integer :height
71
+ end
63
72
  end
data/spec/spec_helper.rb CHANGED
@@ -45,7 +45,7 @@ rescue ActiveRecord::RecordNotUnique
45
45
  end
46
46
 
47
47
  RSpec.configure do |config|
48
- config.before(:each) do
48
+ config.before do
49
49
  DatabaseCleaner.clean
50
50
  end
51
51
  end
@@ -5,7 +5,7 @@ lib = File.expand_path('lib', __dir__)
5
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
  require 'temporal_tables/version'
7
7
 
8
- Gem::Specification.new do |gem| # rubocop:disable Metrics/BlockLength
8
+ Gem::Specification.new do |gem|
9
9
  gem.name = 'temporal_tables'
10
10
  gem.version = TemporalTables::VERSION
11
11
  gem.authors = ['Brent Kroeker']
@@ -21,17 +21,19 @@ Gem::Specification.new do |gem| # rubocop:disable Metrics/BlockLength
21
21
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
22
22
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
23
23
  gem.require_paths = ['lib']
24
- gem.required_ruby_version = '>= 2.5.0'
24
+ gem.required_ruby_version = '>= 3.0.0'
25
25
  gem.metadata = { 'rubygems_mfa_required' => 'true' }
26
26
 
27
- gem.add_dependency 'rails', '>= 6.0', '< 7.1'
27
+ gem.add_dependency 'rails', '>= 6.0', '< 7.2'
28
28
  gem.add_development_dependency 'combustion', '~> 1'
29
29
  gem.add_development_dependency 'database_cleaner'
30
- gem.add_development_dependency 'gemika', '~> 0.6'
30
+ gem.add_development_dependency 'gemika', '~> 0.8'
31
31
  gem.add_development_dependency 'mysql2'
32
32
  gem.add_development_dependency 'pg'
33
33
  gem.add_development_dependency 'pry'
34
34
  gem.add_development_dependency 'rspec', '~> 3.4'
35
35
  gem.add_development_dependency 'rubocop'
36
+ gem.add_development_dependency 'rubocop-rails'
37
+ gem.add_development_dependency 'rubocop-rspec'
36
38
  gem.metadata['rubygems_mfa_required'] = 'true'
37
39
  end