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 +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
|