activerecord-bitemporal 4.1.0 → 4.3.0

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: '09a592f0b1e43e737bd1fdbc8a88f025af734bf3c0d42c4fa2297dbaa72a68e5'
4
- data.tar.gz: b591ee586a0d5fc3f109444787f86bc5c399f22d33c44d84d80bde6f91b141ac
3
+ metadata.gz: ff0157d808949658d0eb00a07b819670383ace1c7896537f6b6e5dfeda9e6c32
4
+ data.tar.gz: 1e14b06aac74ca12b3db6ee75144078eef8e793eda6048c7179fd8ef3025b01d
5
5
  SHA512:
6
- metadata.gz: b0d9d4f5dd752200b2e803bca72b123ed067165bd61092755fb091b10eb35fd58b82617f7957d48f738b8f9ec09c480d8338553c3b33098202056d2d20e94d09
7
- data.tar.gz: d90e6bbb55b783bc75f650c00c4bbaf226b4d5ba67c86e004bfecbe75224031c0a0ad69c95955741c0b560bdc85fc2a4f3945d07885d0b128ecbf0416f003569
6
+ metadata.gz: 6e6ba80c96e30d975d5a1fe5edff0f631e8e4793d98c97e0c859d57948f5919d5aa47ab2990a456712888e8e25913bb370fc0bf3640c9d04eef3686774a00370
7
+ data.tar.gz: cd5d42d05eb0efe13355906b1547f86605aa1e327d1fae87aebb83475c4fe4162f2cba00875e92e6dcc497451d8a6c0bbe8bfffcbad543c972e5b229a05d0a60
data/.gitignore CHANGED
@@ -1,2 +1,4 @@
1
1
  .bundle/
2
+ .rspec_status
3
+ Gemfile.lock
2
4
  gemfiles/*.gemfile.lock
data/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.3.0
4
+
5
+ ### Added
6
+
7
+ - [Add `previously_force_updated?` #142](https://github.com/kufu/activerecord-bitemporal/pull/142)
8
+
9
+ ### Changed
10
+
11
+ ### Deprecated
12
+
13
+ ### Removed
14
+
15
+ ### Fixed
16
+
17
+ ### Chores
18
+
19
+ - [Remove unneeded spec for Rails 5.x #143](https://github.com/kufu/activerecord-bitemporal/pull/143)
20
+
21
+ ## 4.2.0
22
+
23
+ ### Added
24
+
25
+ - [Allow passing `operated_at` to destroy #138](https://github.com/kufu/activerecord-bitemporal/pull/138)
26
+
27
+ ### Changed
28
+
29
+ - [Change not to create history when destroying with `force_update` #135](https://github.com/kufu/activerecord-bitemporal/pull/135)
30
+ - [Raise `ValidDatetimeRangeError` instead of `RecordInvalid` in `_update_row` #136](https://github.com/kufu/activerecord-bitemporal/pull/136)
31
+
32
+ ### Deprecated
33
+
34
+ ### Removed
35
+
36
+ ### Fixed
37
+
38
+ ### Chores
39
+
40
+ - [Fix for RSpec deprecated warning #132](https://github.com/kufu/activerecord-bitemporal/pull/132)
41
+ - [Add some files to .gitignore #134](https://github.com/kufu/activerecord-bitemporal/pull/134)
42
+
3
43
  ## 4.1.0
4
44
 
5
45
  ### Added
@@ -277,12 +277,13 @@ module ActiveRecord
277
277
  end
278
278
 
279
279
  refine ActiveRecord::Base do
280
- # MEMO: Do not copy `swapped_id`
280
+ # MEMO: Do not copy bitemporal internal status
281
281
  def dup(*)
282
282
  super.tap { |itself|
283
283
  itself.instance_exec do
284
284
  @_swapped_id_previously_was = nil
285
285
  @_swapped_id = nil
286
+ @previously_force_updated = false
286
287
  end unless itself.frozen?
287
288
  }
288
289
  end
@@ -320,6 +321,7 @@ module ActiveRecord
320
321
  before_instance&.save_without_bitemporal_callbacks!(validate: false)
321
322
  # NOTE: after_instance always exists
322
323
  after_instance.save_without_bitemporal_callbacks!(validate: false)
324
+ @previously_force_updated = self.force_update?
323
325
 
324
326
  # update 後に新しく生成したインスタンスのデータを移行する
325
327
  @_swapped_id_previously_was = swapped_id
@@ -334,30 +336,33 @@ module ActiveRecord
334
336
  end || false
335
337
  end
336
338
 
337
- def destroy(force_delete: false)
339
+ def destroy(force_delete: false, operated_at: Time.current)
338
340
  return super() if force_delete
339
341
 
340
- current_time = Time.current
341
- target_datetime = valid_datetime || current_time
342
+ target_datetime = valid_datetime || operated_at
342
343
 
343
344
  duplicated_instance = self.class.find_at_time(target_datetime, self.id).dup
344
345
 
345
346
  ActiveRecord::Base.transaction(requires_new: true, joinable: false) do
346
347
  @destroyed = false
347
348
  _run_destroy_callbacks {
348
- @destroyed = update_transaction_to(current_time)
349
-
350
- # 削除時の状態を履歴レコードとして保存する
351
- duplicated_instance.valid_to = target_datetime
352
- duplicated_instance.transaction_from = current_time
353
- duplicated_instance.save_without_bitemporal_callbacks!(validate: false)
354
- if @destroyed
355
- @_swapped_id_previously_was = swapped_id
356
- @_swapped_id = duplicated_instance.swapped_id
357
- self.valid_from = duplicated_instance.valid_from
358
- self.valid_to = duplicated_instance.valid_to
359
- self.transaction_from = duplicated_instance.transaction_from
360
- self.transaction_to = duplicated_instance.transaction_to
349
+ @destroyed = update_transaction_to(operated_at)
350
+ @previously_force_updated = force_update?
351
+
352
+ # force_update の場合は削除時の状態の履歴を残さない
353
+ unless force_update?
354
+ # 削除時の状態を履歴レコードとして保存する
355
+ duplicated_instance.valid_to = target_datetime
356
+ duplicated_instance.transaction_from = operated_at
357
+ duplicated_instance.save_without_bitemporal_callbacks!(validate: false)
358
+ if @destroyed
359
+ @_swapped_id_previously_was = swapped_id
360
+ @_swapped_id = duplicated_instance.swapped_id
361
+ self.valid_from = duplicated_instance.valid_from
362
+ self.valid_to = duplicated_instance.valid_to
363
+ self.transaction_from = duplicated_instance.transaction_from
364
+ self.transaction_to = duplicated_instance.transaction_to
365
+ end
361
366
  end
362
367
  }
363
368
  raise ActiveRecord::RecordInvalid unless @destroyed
@@ -395,6 +400,7 @@ module ActiveRecord
395
400
  # NOTE: Hook to copying swapped_id
396
401
  @_swapped_id_previously_was = nil
397
402
  @_swapped_id = fresh_object.swapped_id
403
+ @previously_force_updated = false
398
404
  self
399
405
  end
400
406
  elsif Gem::Version.new("6.1.0") <= ActiveRecord.version
@@ -418,6 +424,7 @@ module ActiveRecord
418
424
  # NOTE: Hook to copying swapped_id
419
425
  @_swapped_id_previously_was = nil
420
426
  @_swapped_id = fresh_object.swapped_id
427
+ @previously_force_updated = false
421
428
  self
422
429
  end
423
430
  else
@@ -440,6 +447,7 @@ module ActiveRecord
440
447
  # NOTE: Hook to copying swapped_id
441
448
  @_swapped_id_previously_was = nil
442
449
  @_swapped_id = fresh_object.swapped_id
450
+ @previously_force_updated = false
443
451
  self
444
452
  end
445
453
  end
@@ -499,13 +507,17 @@ module ActiveRecord
499
507
 
500
508
  # 以前の履歴データは valid_to を詰めて保存
501
509
  before_instance.valid_to = target_datetime
502
- raise ActiveRecord::RecordInvalid.new(before_instance) if before_instance.valid_from_cannot_be_greater_equal_than_valid_to
510
+ if before_instance.valid_from_cannot_be_greater_equal_than_valid_to
511
+ raise ValidDatetimeRangeError.new("valid_from #{before_instance.valid_from} can't be greater equal than valid_to #{before_instance.valid_to}")
512
+ end
503
513
  before_instance.transaction_from = current_time
504
514
 
505
515
  # 以降の履歴データは valid_from と valid_to を調整して保存する
506
516
  after_instance.valid_from = target_datetime
507
517
  after_instance.valid_to = current_valid_record.valid_to
508
- raise ActiveRecord::RecordInvalid.new(after_instance) if after_instance.valid_from_cannot_be_greater_equal_than_valid_to
518
+ if after_instance.valid_from_cannot_be_greater_equal_than_valid_to
519
+ raise ValidDatetimeRangeError.new("valid_from #{after_instance.valid_from} can't be greater equal than valid_to #{after_instance.valid_to}")
520
+ end
509
521
  after_instance.transaction_from = current_time
510
522
 
511
523
  # 有効なレコードがない場合
@@ -10,7 +10,7 @@ module ActiveRecord::Bitemporal
10
10
  define_model_callbacks :bitemporal_destroy
11
11
  end
12
12
 
13
- def destroy
13
+ def destroy(...)
14
14
  perform_bitemporal_callbacks? ? run_callbacks(:bitemporal_destroy) { super } : super
15
15
  end
16
16
 
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord::Bitemporal
4
+ class BitemporalError < StandardError; end
5
+
6
+ class ValidDatetimeRangeError < BitemporalError; end
7
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ActiveRecord
4
4
  module Bitemporal
5
- VERSION = "4.1.0"
5
+ VERSION = "4.3.0"
6
6
  end
7
7
  end
@@ -4,6 +4,7 @@ require "active_record"
4
4
  require "active_support/core_ext/time/calculations"
5
5
  require "activerecord-bitemporal/bitemporal"
6
6
  require "activerecord-bitemporal/scope"
7
+ require "activerecord-bitemporal/errors"
7
8
  require "activerecord-bitemporal/patches"
8
9
  require "activerecord-bitemporal/version"
9
10
  require "activerecord-bitemporal/visualizer"
@@ -103,6 +104,10 @@ module ActiveRecord::Bitemporal::Bitemporalize
103
104
  swapped_id.presence || super
104
105
  end
105
106
 
107
+ def previously_force_updated?
108
+ @previously_force_updated
109
+ end
110
+
106
111
  def valid_from_cannot_be_greater_equal_than_valid_to
107
112
  if valid_from && valid_to && valid_from >= valid_to
108
113
  errors.add(:valid_from, "can't be greater equal than valid_to")
@@ -140,10 +145,12 @@ module ActiveRecord::Bitemporal::Bitemporalize
140
145
  # MEMO: #update_columns is not call #_update_row (and validations, callbacks)
141
146
  update_columns(bitemporal_id_key => swapped_id) unless send(bitemporal_id_key)
142
147
  swap_id!(without_clear_changes_information: true)
148
+ @previously_force_updated = false
143
149
  end
144
150
 
145
151
  after_find do
146
152
  self.swap_id! if self.send(bitemporal_id_key).present?
153
+ @previously_force_updated = false
147
154
  end
148
155
 
149
156
  # Callback hook to `validates :xxx, uniqueness: true`
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-bitemporal
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 4.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SmartHR
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-28 00:00:00.000000000 Z
11
+ date: 2023-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -166,6 +166,7 @@ files:
166
166
  - lib/activerecord-bitemporal.rb
167
167
  - lib/activerecord-bitemporal/bitemporal.rb
168
168
  - lib/activerecord-bitemporal/callbacks.rb
169
+ - lib/activerecord-bitemporal/errors.rb
169
170
  - lib/activerecord-bitemporal/patches.rb
170
171
  - lib/activerecord-bitemporal/scope.rb
171
172
  - lib/activerecord-bitemporal/version.rb