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 +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +40 -0
- data/lib/activerecord-bitemporal/bitemporal.rb +31 -19
- data/lib/activerecord-bitemporal/callbacks.rb +1 -1
- data/lib/activerecord-bitemporal/errors.rb +7 -0
- data/lib/activerecord-bitemporal/version.rb +1 -1
- data/lib/activerecord-bitemporal.rb +7 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff0157d808949658d0eb00a07b819670383ace1c7896537f6b6e5dfeda9e6c32
|
4
|
+
data.tar.gz: 1e14b06aac74ca12b3db6ee75144078eef8e793eda6048c7179fd8ef3025b01d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e6ba80c96e30d975d5a1fe5edff0f631e8e4793d98c97e0c859d57948f5919d5aa47ab2990a456712888e8e25913bb370fc0bf3640c9d04eef3686774a00370
|
7
|
+
data.tar.gz: cd5d42d05eb0efe13355906b1547f86605aa1e327d1fae87aebb83475c4fe4162f2cba00875e92e6dcc497451d8a6c0bbe8bfffcbad543c972e5b229a05d0a60
|
data/.gitignore
CHANGED
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
|
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
|
-
|
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(
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
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
|
-
|
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
|
-
|
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
|
# 有効なレコードがない場合
|
@@ -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.
|
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-
|
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
|