activerecord-bitemporal 4.1.0 → 4.3.0

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: '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