activerecord-bitemporal 5.2.0 → 5.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/.github/dependabot.yml +6 -0
- data/.github/workflows/release.yml +1 -1
- data/.github/workflows/test.yml +54 -0
- data/CHANGELOG.md +27 -0
- data/README.md +11 -11
- data/{docker-compose.yml → compose.yml} +0 -1
- data/lib/activerecord-bitemporal/bitemporal.rb +2 -2
- data/lib/activerecord-bitemporal/scope.rb +5 -1
- data/lib/activerecord-bitemporal/version.rb +1 -1
- data/lib/activerecord-bitemporal.rb +5 -17
- metadata +5 -4
- data/.circleci/config.yml +0 -40
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c660ad9554b7d5285a28f3efcd6a6c10e2b5e45b6922956e37f931ae807ba483
|
|
4
|
+
data.tar.gz: 24646d6dc75344e11f613f70c7847639f8c86524ce3d1b178f4abb69dc60694f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 39e0aea4e39482bcb929d0df586232413193f57a232ca7b2b928ca9aaef90d84fa88fc1edb925bcbff466864314beafa69e9caf36057ba7f4529019791d33698
|
|
7
|
+
data.tar.gz: 84bc4e20042ffb77c2f317fcf6ce85b1b469edb338ec0a1346a9dd0008d1b01e49037503124778144521704ed97af904632bf91f424acc41448968d4beba0a5b
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
|
|
2
|
+
|
|
3
|
+
name: Test
|
|
4
|
+
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
branches:
|
|
8
|
+
- master
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
ruby-version:
|
|
18
|
+
- '3.0'
|
|
19
|
+
- '3.1'
|
|
20
|
+
- '3.2'
|
|
21
|
+
- '3.3'
|
|
22
|
+
gemfile:
|
|
23
|
+
- rails_6.1
|
|
24
|
+
- rails_7.0
|
|
25
|
+
- rails_7.1
|
|
26
|
+
exclude:
|
|
27
|
+
- ruby-version: '3.2'
|
|
28
|
+
gemfile: rails_6.1
|
|
29
|
+
- ruby-version: '3.3'
|
|
30
|
+
gemfile: rails_6.1
|
|
31
|
+
services:
|
|
32
|
+
postgres:
|
|
33
|
+
image: postgres:14
|
|
34
|
+
env:
|
|
35
|
+
POSTGRES_PASSWORD: postgres
|
|
36
|
+
# Set health checks to wait until postgres has started
|
|
37
|
+
options: >-
|
|
38
|
+
--health-cmd pg_isready
|
|
39
|
+
--health-interval 10s
|
|
40
|
+
--health-timeout 5s
|
|
41
|
+
--health-retries 5
|
|
42
|
+
ports:
|
|
43
|
+
- 5432:5432
|
|
44
|
+
env:
|
|
45
|
+
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
|
46
|
+
steps:
|
|
47
|
+
- name: Checkout
|
|
48
|
+
uses: actions/checkout@v4
|
|
49
|
+
- name: Setup Ruby
|
|
50
|
+
uses: ruby/setup-ruby@v1
|
|
51
|
+
with:
|
|
52
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
53
|
+
bundler-cache: true
|
|
54
|
+
- run: bundle exec rspec
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.3.0
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- [Replace `default` overrides from `load_schema!` to `attribute` #172](https://github.com/kufu/activerecord-bitemporal/pull/172)
|
|
10
|
+
- [`Or` node changed to `Nary` in Rails 7.2 #173](https://github.com/kufu/activerecord-bitemporal/pull/173)
|
|
11
|
+
- [Exclude record valid range end in uniqueness validation #184](https://github.com/kufu/activerecord-bitemporal/pull/184)
|
|
12
|
+
|
|
13
|
+
### Deprecated
|
|
14
|
+
|
|
15
|
+
### Removed
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
### Chores
|
|
20
|
+
|
|
21
|
+
- [Add specs under specific conditions #171](https://github.com/kufu/activerecord-bitemporal/pull/171)
|
|
22
|
+
- [Add Dependabot for GitHub Actions #174](https://github.com/kufu/activerecord-bitemporal/pull/174)
|
|
23
|
+
- [Bump actions/checkout from 3 to 4 #175](https://github.com/kufu/activerecord-bitemporal/pull/175)
|
|
24
|
+
- [Replace CircleCI with GitHub Actions #177](https://github.com/kufu/activerecord-bitemporal/pull/177)
|
|
25
|
+
- [Update README as `within_deleted` and `without_deleted` are deprecated #178](https://github.com/kufu/activerecord-bitemporal/pull/178)
|
|
26
|
+
- [Fix typo #181](https://github.com/kufu/activerecord-bitemporal/pull/181)
|
|
27
|
+
- [Fix #force_update block comment #183](https://github.com/kufu/activerecord-bitemporal/pull/183)
|
|
28
|
+
- [Support Docker Compose V2 #186](https://github.com/kufu/activerecord-bitemporal/pull/186)
|
|
29
|
+
|
|
3
30
|
## 5.2.0
|
|
4
31
|
|
|
5
32
|
### Added
|
data/README.md
CHANGED
|
@@ -317,7 +317,7 @@ Timecop.freeze("2019/1/10") {
|
|
|
317
317
|
}
|
|
318
318
|
|
|
319
319
|
Timecop.freeze("2019/1/20") {
|
|
320
|
-
# #force_update
|
|
320
|
+
# #force_update のブロック内で自身を受け取る
|
|
321
321
|
# このブロック内であれば履歴を生成せずにレコードの変更が行われる
|
|
322
322
|
employee.force_update { |employee|
|
|
323
323
|
employee.update(name: "Tom")
|
|
@@ -415,7 +415,7 @@ BTDM では DB からレコードを参照する場合、暗黙的に
|
|
|
415
415
|
Timecop.freeze("2019/1/20") {
|
|
416
416
|
# 現在の時間の履歴を返すために暗黙的に時間指定や論理削除されたレコードが除かれる
|
|
417
417
|
puts Employee.all.to_sql
|
|
418
|
-
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-20 00:00:00' AND "employees"."valid_to" > '2019-01-20 00:00:00' AND "employees"."transaction_to"
|
|
418
|
+
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-20 00:00:00' AND "employees"."valid_to" > '2019-01-20 00:00:00' AND "employees"."transaction_from" <= '2019-01-20 00:00:00' AND "employees"."transaction_to" > '2019-01-20 00:00:00'
|
|
419
419
|
}
|
|
420
420
|
```
|
|
421
421
|
|
|
@@ -454,7 +454,7 @@ Timecop.freeze("2019/1/20") {
|
|
|
454
454
|
|
|
455
455
|
# なぜなら暗黙的に時間指定のクエリが追加されている為
|
|
456
456
|
puts Employee.where(name: "Jane").to_sql
|
|
457
|
-
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-20 00:00:00' AND "employees"."valid_to" > '2019-01-20 00:00:00' AND "employees"."transaction_to"
|
|
457
|
+
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-20 00:00:00' AND "employees"."valid_to" > '2019-01-20 00:00:00' AND "employees"."transaction_from" <= '2019-01-20 00:00:00' AND "employees"."transaction_to" > '2019-01-20 00:00:00' AND "employees"."name" = 'Jane'
|
|
458
458
|
}
|
|
459
459
|
```
|
|
460
460
|
|
|
@@ -464,7 +464,7 @@ Timecop.freeze("2019/1/20") {
|
|
|
464
464
|
```ruby
|
|
465
465
|
# default_scope であれば unscoped で無効化することが出来るが、BTDM のデフォルトクエリはそのまま
|
|
466
466
|
puts Employee.unscoped { Employee.all.to_sql }
|
|
467
|
-
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-10-25 07:56:06.731259' AND "employees"."valid_to" > '2019-10-25 07:56:06.731259' AND "employees"."transaction_to"
|
|
467
|
+
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-10-25 07:56:06.731259' AND "employees"."valid_to" > '2019-10-25 07:56:06.731259' AND "employees"."transaction_from" <= '2019-10-25 07:56:06.731259' AND "employees"."transaction_to" > '2019-10-25 07:56:06.731259'
|
|
468
468
|
```
|
|
469
469
|
|
|
470
470
|
|
|
@@ -475,21 +475,21 @@ puts Employee.unscoped { Employee.all.to_sql }
|
|
|
475
475
|
| スコープ | 動作 |
|
|
476
476
|
| --- | --- |
|
|
477
477
|
| `.ignore_valid_datetime` | 時間指定を無視する |
|
|
478
|
-
| `.
|
|
479
|
-
| `.
|
|
478
|
+
| `.ignore_transaction_datetime` | 論理削除されているレコードを含める |
|
|
479
|
+
| `.ignore_bitemporal_datetime` | 全てのレコードを対象とする |
|
|
480
480
|
|
|
481
481
|
```ruby
|
|
482
482
|
Timecop.freeze("2019/1/20") {
|
|
483
483
|
# 時間指定をしているクエリを取り除く
|
|
484
484
|
puts Employee.ignore_valid_datetime.to_sql
|
|
485
|
-
# => SELECT "employees".* FROM "employees" WHERE "employees"."transaction_to"
|
|
485
|
+
# => SELECT "employees".* FROM "employees" WHERE "employees"."transaction_from" <= '2019-01-20 00:00:00' AND "employees"."transaction_to" > '2019-01-20 00:00:00'
|
|
486
486
|
|
|
487
487
|
# 論理削除しているレコードも含める
|
|
488
|
-
puts Employee.
|
|
488
|
+
puts Employee.ignore_transaction_datetime.to_sql
|
|
489
489
|
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-20 00:00:00' AND "employees"."valid_to" > '2019-01-20 00:00:00'
|
|
490
490
|
|
|
491
491
|
# 全てのレコードを対象とする
|
|
492
|
-
puts Employee.
|
|
492
|
+
puts Employee.ignore_bitemporal_datetime.to_sql
|
|
493
493
|
# => SELECT "employees".* FROM "employees"
|
|
494
494
|
}
|
|
495
495
|
```
|
|
@@ -534,7 +534,7 @@ Timecop.freeze("2019/1/15") {
|
|
|
534
534
|
Timecop.freeze("2019/1/20") {
|
|
535
535
|
# valid_at で任意の時間を参照して検索する事が出来る
|
|
536
536
|
puts Employee.valid_at("2019/1/10").to_sql
|
|
537
|
-
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-10 00:00:00' AND "employees"."valid_to" > '2019-01-10 00:00:00' AND "employees"."transaction_to"
|
|
537
|
+
# => SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-10 00:00:00' AND "employees"."valid_to" > '2019-01-10 00:00:00' AND "employees"."transaction_from" <= '2019-01-20 00:00:00' AND "employees"."transaction_to" > '2019-01-20 00:00:00'
|
|
538
538
|
|
|
539
539
|
pp Employee.valid_at("2019/1/10").map(&:name)
|
|
540
540
|
# => ["Jane"]
|
|
@@ -696,7 +696,7 @@ BTDM では `find_by(id: xxx)` や `where(id: xxx)` を行う場合 `id` では
|
|
|
696
696
|
Employee.find_by(id: employee.id)
|
|
697
697
|
|
|
698
698
|
# OK : bitemporal_id で検索を行う
|
|
699
|
-
# MEMO: id = bitemporal_id
|
|
699
|
+
# MEMO: id = bitemporal_id なので
|
|
700
700
|
# find_by(bitemporal_id: employee.id)
|
|
701
701
|
# でも動作するが employee.bitemporal_id と書いたほうが意図が伝わりやすい
|
|
702
702
|
Employee.find_by(bitemporal_id: employee.bitemporal_id)
|
|
@@ -595,8 +595,8 @@ module ActiveRecord
|
|
|
595
595
|
# レコードを更新する時に valid_datetime が valid_from ~ valid_to の範囲外だった場合、
|
|
596
596
|
# 一番近い未来の履歴レコードを参照して更新する
|
|
597
597
|
# という仕様があるため、それを考慮して valid_to を設定する
|
|
598
|
-
if (record_valid_time && (record.valid_from
|
|
599
|
-
finder_class.ignore_valid_datetime.where(bitemporal_id: record.bitemporal_id).
|
|
598
|
+
if (record_valid_time && (record.valid_from...record.valid_to).cover?(record_valid_time)) == false && (record.persisted?)
|
|
599
|
+
finder_class.ignore_valid_datetime.where(bitemporal_id: record.bitemporal_id).valid_from_gteq(target_datetime).order(valid_from: :asc).first.valid_from
|
|
600
600
|
else
|
|
601
601
|
valid_to
|
|
602
602
|
end
|
|
@@ -27,6 +27,10 @@ module ActiveRecord::Bitemporal
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
module Relation
|
|
30
|
+
# see: https://github.com/rails/rails/pull/51492
|
|
31
|
+
NARY_NODE = ActiveRecord.gem_version >= Gem::Version.new("7.2.0") ? Arel::Nodes::Nary : Arel::Nodes::And
|
|
32
|
+
private_constant :NARY_NODE
|
|
33
|
+
|
|
30
34
|
using Module.new {
|
|
31
35
|
refine ActiveRecord::Relation::WhereClause do
|
|
32
36
|
using Module.new {
|
|
@@ -56,7 +60,7 @@ module ActiveRecord::Bitemporal
|
|
|
56
60
|
case node
|
|
57
61
|
when Arel::Nodes::LessThan, Arel::Nodes::LessThanOrEqual, Arel::Nodes::GreaterThan, Arel::Nodes::GreaterThanOrEqual
|
|
58
62
|
y << node if node && node.left.respond_to?(:relation)
|
|
59
|
-
when
|
|
63
|
+
when NARY_NODE
|
|
60
64
|
each_operatable_node(node.children) { |node| y << node }
|
|
61
65
|
when Arel::Nodes::Binary
|
|
62
66
|
each_operatable_node(node.left) { |node| y << node }
|
|
@@ -37,13 +37,6 @@ module ActiveRecord::Bitemporal::Bitemporalize
|
|
|
37
37
|
module ClassMethods
|
|
38
38
|
include ActiveRecord::Bitemporal::Relation::Finder
|
|
39
39
|
|
|
40
|
-
DEFAULT_ATTRIBUTES = {
|
|
41
|
-
valid_from: ActiveRecord::Bitemporal::DEFAULT_VALID_FROM,
|
|
42
|
-
valid_to: ActiveRecord::Bitemporal::DEFAULT_VALID_TO,
|
|
43
|
-
transaction_from: ActiveRecord::Bitemporal::DEFAULT_TRANSACTION_FROM,
|
|
44
|
-
transaction_to: ActiveRecord::Bitemporal::DEFAULT_TRANSACTION_TO
|
|
45
|
-
}.freeze
|
|
46
|
-
|
|
47
40
|
def bitemporal_id_key
|
|
48
41
|
'bitemporal_id'
|
|
49
42
|
end
|
|
@@ -62,16 +55,6 @@ module ActiveRecord::Bitemporal::Bitemporalize
|
|
|
62
55
|
klass.relation_delegate_class(ActiveRecord::Relation).prepend ActiveRecord::Bitemporal::Relation::MergeWithExceptBitemporalDefaultScope
|
|
63
56
|
end
|
|
64
57
|
end
|
|
65
|
-
|
|
66
|
-
private
|
|
67
|
-
def load_schema!
|
|
68
|
-
super
|
|
69
|
-
|
|
70
|
-
DEFAULT_ATTRIBUTES.each do |name, default_value|
|
|
71
|
-
type = type_for_attribute(name)
|
|
72
|
-
define_attribute(name.to_s, type, default: default_value)
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
58
|
end
|
|
76
59
|
|
|
77
60
|
module InstanceMethods
|
|
@@ -153,6 +136,11 @@ module ActiveRecord::Bitemporal::Bitemporalize
|
|
|
153
136
|
@previously_force_updated = false
|
|
154
137
|
end
|
|
155
138
|
|
|
139
|
+
attribute :valid_from, default: ActiveRecord::Bitemporal::DEFAULT_VALID_FROM
|
|
140
|
+
attribute :valid_to, default: ActiveRecord::Bitemporal::DEFAULT_VALID_TO
|
|
141
|
+
attribute :transaction_from, default: ActiveRecord::Bitemporal::DEFAULT_TRANSACTION_FROM
|
|
142
|
+
attribute :transaction_to, default: ActiveRecord::Bitemporal::DEFAULT_TRANSACTION_TO
|
|
143
|
+
|
|
156
144
|
# Callback hook to `validates :xxx, uniqueness: true`
|
|
157
145
|
const_set(:UniquenessValidator, Class.new(ActiveRecord::Validations::UniquenessValidator) {
|
|
158
146
|
prepend ActiveRecord::Bitemporal::Uniqueness
|
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: 5.
|
|
4
|
+
version: 5.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:
|
|
11
|
+
date: 2025-01-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|
|
@@ -129,9 +129,10 @@ executables: []
|
|
|
129
129
|
extensions: []
|
|
130
130
|
extra_rdoc_files: []
|
|
131
131
|
files:
|
|
132
|
-
- ".circleci/config.yml"
|
|
133
132
|
- ".github/auto_assign.yml"
|
|
133
|
+
- ".github/dependabot.yml"
|
|
134
134
|
- ".github/workflows/release.yml"
|
|
135
|
+
- ".github/workflows/test.yml"
|
|
135
136
|
- ".gitignore"
|
|
136
137
|
- Appraisals
|
|
137
138
|
- CHANGELOG.md
|
|
@@ -144,7 +145,7 @@ files:
|
|
|
144
145
|
- activerecord-bitemporal.gemspec
|
|
145
146
|
- bin/console
|
|
146
147
|
- bin/setup
|
|
147
|
-
-
|
|
148
|
+
- compose.yml
|
|
148
149
|
- gemfiles/rails_6.1.gemfile
|
|
149
150
|
- gemfiles/rails_7.0.gemfile
|
|
150
151
|
- gemfiles/rails_7.1.gemfile
|
data/.circleci/config.yml
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
version: 2.1
|
|
2
|
-
|
|
3
|
-
jobs:
|
|
4
|
-
rspec:
|
|
5
|
-
parameters:
|
|
6
|
-
ruby-version:
|
|
7
|
-
type: string
|
|
8
|
-
gemfile:
|
|
9
|
-
type: string
|
|
10
|
-
docker:
|
|
11
|
-
- image: ruby:<< parameters.ruby-version >>
|
|
12
|
-
environment:
|
|
13
|
-
BUNDLE_GEMFILE: gemfiles/<< parameters.gemfile >>.gemfile
|
|
14
|
-
- image: cimg/postgres:11.16
|
|
15
|
-
steps:
|
|
16
|
-
- checkout
|
|
17
|
-
- run: gem install bundler
|
|
18
|
-
- run: bundle install
|
|
19
|
-
- run: bundle exec rspec
|
|
20
|
-
|
|
21
|
-
workflows:
|
|
22
|
-
test:
|
|
23
|
-
jobs:
|
|
24
|
-
- rspec:
|
|
25
|
-
matrix:
|
|
26
|
-
parameters:
|
|
27
|
-
ruby-version:
|
|
28
|
-
- '3.0'
|
|
29
|
-
- '3.1'
|
|
30
|
-
- '3.2'
|
|
31
|
-
- '3.3'
|
|
32
|
-
gemfile:
|
|
33
|
-
- rails_6.1
|
|
34
|
-
- rails_7.0
|
|
35
|
-
- rails_7.1
|
|
36
|
-
exclude:
|
|
37
|
-
- ruby-version: '3.2'
|
|
38
|
-
gemfile: rails_6.1
|
|
39
|
-
- ruby-version: '3.3'
|
|
40
|
-
gemfile: rails_6.1
|